既に存在する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 使えるクラスに制限がある

 使用可能なクラスに制限があるのは有名だと思いますが、意外とエラーが出ました。
 エラーのチェックは、プロジェクトのプロパティの「ビルダー」の項に表示される以下のビルダーがやってるっぽいです。

 使用不可能として検出されたクラスは以下の通りです。
 「無理せず、ざくざく消そうと」いう発想により、ビルドできない箇所をパッケージ単位でざくざく消すことにより対処しました。

  • 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)

さいごに

 悔しいですが、解決にどれぐらい掛かるか読めなかったため断念です。
 とほほ。