既に存在するEclipseのプロジェクトをGoogle App Engineに載せようとしたら、意外と難しかった
はじめに
「http://d.hatena.ne.jp/t_yano/20090412/1239498549」を読んで、「よし。私はasf - Revision 1833661: /wicket/tags/wicket-1.3.6/jdk-1.5/wicket-examplesをビルドして動かしてやろう」と思ったものの、意外と難しくて断念しました。
その断念に至るまでのメモ。
ちなみに、断念した理由はWicketと多分関係ないです。
余談ですが、wicket-examplesではなくwicket-quickstartを配置しようとしたら、ちょっとの変更で配置できました。
障害1 使えるクラスに制限がある
使用可能なクラスに制限があるのは有名だと思いますが、意外とエラーが出ました。
エラーのチェックは、プロジェクトのプロパティの「ビルダー」の項に表示される以下のビルダーがやってるっぽいです。
- Google WebApp Project Validator
- Google App Engine Project Validator
使用不可能として検出されたクラスは以下の通りです。
「無理せず、ざくざく消そうと」いう発想により、ビルドできない箇所をパッケージ単位でざくざく消すことにより対処しました。
- java.awt.BasicStroke
- java.awt.Color
- java.awt.Font
- java.awt.Graphics2D
- java.awt.image.BufferedImage
- java.lang.management.ManagementFactory
- java.net.InetAddress
- javax.management.MBeanServer
- javax.swing.tree.DefaultMutableTreeNode
- javax.swing.tree.DefaultTreeModel
- javax.swing.tree.TreeModel
- javax.swing.tree.TreeNode
障害2 ビルド時に「CreateProcess error=87」と記載されたダイアログが表示される
ビルド時に、以下のURLに記載されている事象に遭遇しました。相違点は、記事に記載れている対処法を行っても、エラーが解決しなかったことです。
事象が発生した際に「workspace\.metadata\.log」に記録されるエラーは以下の通り。
!ENTRY com.google.appengine.eclipse.core 4 0 2010-05-04 13:50:05.390 !MESSAGE Cannot run program "C:\Java\jre6\bin\javaw.exe" (in directory "C:\workspace\wicket-examples"): CreateProcess error=87,(何か文字化け) !STACK 0 java.io.IOException: Cannot run program "C:\Java\jre6\bin\javaw.exe" (in directory "C:\workspace\wicket-examples"): CreateProcess error=87,(何か文字化け) at java.lang.ProcessBuilder.start(Unknown Source) at com.google.gdt.eclipse.core.ProcessUtilities.launchProcessAndActivateOnError(ProcessUtilities.java:195) at com.google.appengine.eclipse.core.orm.enhancement.EnhancerJob.runInWorkspace(EnhancerJob.java:78) at org.eclipse.core.internal.resources.InternalWorkspaceJob.run(InternalWorkspaceJob.java:38) at org.eclipse.core.internal.jobs.Worker.run(Worker.java:55) Caused by: java.io.IOException: CreateProcess error=87, p[ at java.lang.ProcessImpl.create(Native Method) at java.lang.ProcessImpl.(Unknown Source) at java.lang.ProcessImpl.start(Unknown Source) ... 5 more
画面に表示されたメッセージから、以下のサイトに記述されているJDO関連のタスクが原因だと予想されました。
良い対策が浮かばなかったので、プロジェクトのプロパティーの「ビルダー」から「Enhancer」を外してみました。どうせJDO使ってないし。
結果、良いのかは分かりませんが、ビルド時のエラーは表示されなくなりました。
障害3 ローカルで起動した際に、jettyがエラーを出力する
ここで力尽きました。xercesをとってきて配置すれば動きそうではあるのですが、それは解決方法として変な気がしたので止めです。
エラーメッセージは以下のとおりです。
警告: failed com.google.apphosting.utils.jetty.DevAppEngineWebAppContext@12611a7{/,C:\workspace\wicket-examples\target\wicket-examples-1.3.6}: javax.xml.parsers.FactoryConfigurationError: Provider org.apache.xerces.jaxp.SAXParserFactoryImpl not found 2010/05/04 15:26:26 com.google.apphosting.utils.jetty.JettyLogger warn 警告: failed JettyContainerService$ApiProxyHandler@51052d: javax.xml.parsers.FactoryConfigurationError: Provider org.apache.xerces.jaxp.SAXParserFactoryImpl not found 2010/05/04 15:26:26 com.google.apphosting.utils.jetty.JettyLogger warn 警告: Error starting handlers javax.xml.parsers.FactoryConfigurationError: Provider org.apache.xerces.jaxp.SAXParserFactoryImpl not found at javax.xml.parsers.SAXParserFactory.newInstance(SAXParserFactory.java:134) at org.mortbay.xml.XmlParser.setValidating(XmlParser.java:91) at org.mortbay.xml.XmlParser.<init>(XmlParser.java:83) at org.mortbay.jetty.webapp.TagLibConfiguration.configureWebApp(TagLibConfiguration.java:210) at org.mortbay.jetty.webapp.WebAppContext.startContext(WebAppContext.java:1247) at org.mortbay.jetty.handler.ContextHandler.doStart(ContextHandler.java:517) at org.mortbay.jetty.webapp.WebAppContext.doStart(WebAppContext.java:467) at org.mortbay.component.AbstractLifeCycle.start(AbstractLifeCycle.java:50) at org.mortbay.jetty.handler.HandlerWrapper.doStart(HandlerWrapper.java:130) at org.mortbay.component.AbstractLifeCycle.start(AbstractLifeCycle.java:50) at org.mortbay.jetty.handler.HandlerWrapper.doStart(HandlerWrapper.java:130) at org.mortbay.jetty.Server.doStart(Server.java:224) at org.mortbay.component.AbstractLifeCycle.start(AbstractLifeCycle.java:50) at com.google.appengine.tools.development.JettyContainerService.startContainer(JettyContainerService.java:185) at com.google.appengine.tools.development.AbstractContainerService.startup(AbstractContainerService.java:146) at com.google.appengine.tools.development.DevAppServerImpl.start(DevAppServerImpl.java:219) at com.google.appengine.tools.development.DevAppServerMain$StartAction.apply(DevAppServerMain.java:162) at com.google.appengine.tools.util.Parser$ParseResult.applyArgs(Parser.java:48) at com.google.appengine.tools.development.DevAppServerMain.<init>(DevAppServerMain.java:113) at com.google.appengine.tools.development.DevAppServerMain.main(DevAppServerMain.java:89)
さいごに
悔しいですが、解決にどれぐらい掛かるか読めなかったため断念です。
とほほ。