1

Google App Engine にデプロイするために Eclipse Juno 内で JAX-RS を構成するのに苦労しています。実際、ローカル デプロイ (Jetty) を機能させるまでには至っていません。

これが私が経験しているスタックトレースですが、すべてのジャージーjarファイルを含めたときに、クラスcom.sun.jersey.spi.container.servlet.Servlet.ServletContainerを見つけるのにまだ問題がある理由がわかりません(やり過ぎです)私は知っています) およびすべての JAXB JAR ファイル (私はまだそこまで気にかけていません!)。

2012-11-25 22:22:50.622 java[5703:707] [Java CocoaComponent compatibility mode]: Enabled
2012-11-25 22:22:50.623 java[5703:707] [Java CocoaComponent compatibility mode]: Setting timeout for SWT to 0.100000
Nov 25, 2012 10:22:51 PM com.google.apphosting.utils.jetty.JettyLogger info
INFO: Logging to JettyLogger(null) via com.google.apphosting.utils.jetty.JettyLogger
Nov 25, 2012 10:22:51 PM com.google.apphosting.utils.config.AppEngineWebXmlReader readAppEngineWebXml
INFO: Successfully processed /Users/Rob/Development/HillingarIncidentReporting/HillingarGaeServer/war/WEB-INF/appengine-web.xml
Nov 25, 2012 10:22:51 PM com.google.apphosting.utils.config.AbstractConfigXmlReader readConfigXml
INFO: Successfully processed /Users/Rob/Development/HillingarIncidentReporting/HillingarGaeServer/war/WEB-INF/web.xml
Nov 25, 2012 10:22:52 PM com.google.apphosting.utils.jetty.JettyLogger warn
WARNING: EXCEPTION 
java.lang.ClassNotFoundException: com.sun.jersey.spi.container.servlet.ServletContainer
    at java.net.URLClassLoader$1.run(URLClassLoader.java:202)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.net.URLClassLoader.findClass(URLClassLoader.java:190)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:306)
    at com.google.appengine.tools.development.IsolatedAppClassLoader.loadClass(IsolatedAppClassLoader.java:207)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:247)
    at org.mortbay.util.Loader.loadClass(Loader.java:91)
    at org.mortbay.util.Loader.loadClass(Loader.java:71)
    at org.mortbay.jetty.servlet.Holder.doStart(Holder.java:73)
    at org.mortbay.jetty.servlet.ServletHolder.doStart(ServletHolder.java:242)
    at org.mortbay.component.AbstractLifeCycle.start(AbstractLifeCycle.java:50)
    at org.mortbay.jetty.servlet.ServletHandler.initialize(ServletHandler.java:685)
    at org.mortbay.jetty.servlet.Context.startContext(Context.java:140)
    at org.mortbay.jetty.webapp.WebAppContext.startContext(WebAppContext.java:1250)
    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:205)
    at com.google.appengine.tools.development.AbstractContainerService.startup(AbstractContainerService.java:249)
    at com.google.appengine.tools.development.DevAppServerImpl.start(DevAppServerImpl.java:157)
    at com.google.appengine.tools.development.DevAppServerMain$StartAction.apply(DevAppServerMain.java:333)
    at com.google.appengine.tools.util.Parser$ParseResult.applyArgs(Parser.java:48)
    at com.google.appengine.tools.development.DevAppServerMain.<init>(DevAppServerMain.java:269)
    at com.google.appengine.tools.development.DevAppServerMain.main(DevAppServerMain.java:245)
Nov 25, 2012 10:22:52 PM com.google.appengine.tools.development.ApiProxyLocalImpl log
SEVERE: javax.servlet.ServletContext log: unavailable
javax.servlet.UnavailableException: com.sun.jersey.spi.container.servlet.ServletContainer
    at org.mortbay.jetty.servlet.Holder.doStart(Holder.java:79)
    at org.mortbay.jetty.servlet.ServletHolder.doStart(ServletHolder.java:242)
    at org.mortbay.component.AbstractLifeCycle.start(AbstractLifeCycle.java:50)
    at org.mortbay.jetty.servlet.ServletHandler.initialize(ServletHandler.java:685)
    at org.mortbay.jetty.servlet.Context.startContext(Context.java:140)
    at org.mortbay.jetty.webapp.WebAppContext.startContext(WebAppContext.java:1250)
    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:205)
    at com.google.appengine.tools.development.AbstractContainerService.startup(AbstractContainerService.java:249)
    at com.google.appengine.tools.development.DevAppServerImpl.start(DevAppServerImpl.java:157)
    at com.google.appengine.tools.development.DevAppServerMain$StartAction.apply(DevAppServerMain.java:333)
    at com.google.appengine.tools.util.Parser$ParseResult.applyArgs(Parser.java:48)
    at com.google.appengine.tools.development.DevAppServerMain.<init>(DevAppServerMain.java:269)
    at com.google.appengine.tools.development.DevAppServerMain.main(DevAppServerMain.java:245)

Nov 25, 2012 10:22:52 PM com.google.apphosting.utils.jetty.JettyLogger warn
WARNING: failed Jersey Web Application: java.lang.NullPointerException
Nov 25, 2012 10:22:52 PM com.google.apphosting.utils.jetty.JettyLogger warn
WARNING: Failed startup of context com.google.appengine.tools.development.DevAppEngineWebAppContext@798baf36{/,/Users/Rob/Development/HillingarIncidentReporting/HillingarGaeServer/war}
java.lang.NullPointerException
    at java.lang.Class.isAssignableFrom(Native Method)
    at org.mortbay.jetty.servlet.ServletHolder.doStart(ServletHolder.java:256)
    at org.mortbay.component.AbstractLifeCycle.start(AbstractLifeCycle.java:50)
    at org.mortbay.jetty.servlet.ServletHandler.initialize(ServletHandler.java:685)
    at org.mortbay.jetty.servlet.Context.startContext(Context.java:140)
    at org.mortbay.jetty.webapp.WebAppContext.startContext(WebAppContext.java:1250)
    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:205)
    at com.google.appengine.tools.development.AbstractContainerService.startup(AbstractContainerService.java:249)
    at com.google.appengine.tools.development.DevAppServerImpl.start(DevAppServerImpl.java:157)
    at com.google.appengine.tools.development.DevAppServerMain$StartAction.apply(DevAppServerMain.java:333)
    at com.google.appengine.tools.util.Parser$ParseResult.applyArgs(Parser.java:48)
    at com.google.appengine.tools.development.DevAppServerMain.<init>(DevAppServerMain.java:269)
    at com.google.appengine.tools.development.DevAppServerMain.main(DevAppServerMain.java:245)
Nov 25, 2012 10:22:52 PM com.google.appengine.tools.development.DevAppServerImpl start
INFO: The server is running at http://localhost:8888/
Nov 25, 2012 10:22:52 PM com.google.appengine.tools.development.DevAppServerImpl start
INFO: The admin console is running at http://localhost:8888/_ah/admin
2012-11-25 22:22:55.378 java[5703:6c03] Unable to obtain JNIEnv for context: 0x0

これは、Eclipse プロジェクトで指定されたすべての JAR ファイルのスクリーンショットです。これは、Jetty でローカル展開に使用されていると思いますか?

ビルド パスで参照される JAR - ビルド パスの構成

さらに、/war/WEB-INF/lib フォルダにある同じ Jersey および JAXB jar ファイルのコピーを次に示します。これは、最終的に Google App Engine にデプロイされたときに、他の多くのフォーラムで提案されているとおりです。

デプロイされた war lib ファイル

質問 1 主に、JAR がロードされない理由を解決する必要があります。それらがロードされる順序を変更しようとしました (ビルド パス - ビルド パスの構成でしか変更できないようです)、ここでは最初に jersey-servlet-1.15.jar ファイルを設定します (問題のあるクラスがあるため)。現在)。

これを解決しようとするたびに、プロジェクトをクリーンアップしました。私が何を見逃しているか知っている人はいますか?

質問 2 さらに、より低い優先度で、Jersey および JAXB Jars が実際に必要なものは何かということも考えています。非常に小さなサブセットのみが必要であると思われます。jersey-servley-1.15.jar だけを試してみましたが、まだ不平を言っていますが、おそらくすべての jar が競合しています。

質問 3 Jersey には asm-3.1.jar が含まれていますが、GAE には既に asm-4.0.jar が含まれていますが、新しいバージョンが既に存在するため、3.1 を含めるべきではありませんか?

質問 4 ServletContextListener を拡張するクラスを作成しようとすると、Eclipse はクラスのリストに「ServletContextListener」を提供しませんが、クラスパスでは「App Engine SDK」バージョン 1.7.3 に servlet-api が含まれていることが明確にわかります。 jar であり、これも実行時に Jetty にデフォルトで含まれていると思われます。

どうぞよろしくお願いいたします。

4

1 に答える 1

1

web.xml にサーブレット マッピングを追加する必要があるのではないでしょうか? 例(Springを使用していますが、似ているはずです):

<servlet>
    <servlet-name>REST Service</servlet-name>
    <servlet-class>com.sun.jersey.spi.spring.container.servlet.SpringServlet</servlet-class>
    <init-param>
        <param-name>com.sun.jersey.config.property.packages</param-name>
        <param-value>com.evogro</param-value>
    </init-param>
    <init-param>
        <param-name>com.sun.jersey.spi.container.ContainerRequestFilters</param-name>
        <param-value>com.sun.jersey.api.container.filter.LoggingFilter</param-value>
    </init-param>
    <init-param>
        <param-name>com.sun.jersey.spi.container.ContainerResponseFilters</param-name>
        <param-value>com.sun.jersey.api.container.filter.LoggingFilter</param-value>
    </init-param>
        <load-on-startup>1</load-on-startup>
</servlet>

<servlet-mapping>
    <servlet-name>REST Service</servlet-name>
    <url-pattern>/api/*</url-pattern>
</servlet-mapping>

Q2: あなたのリストは私のものと一致します (Maven 経由で含まれています)。私はジャージ1.13を使用しています。それが最低限のセットかどうかはわかりませんが、

Q3: datanucleus-enhancer の依存関係として ASM-3.3.1 を含めました。これは、デプロイされる jar のリストにあります。GAE は気に入らない jar を交換します

Q4: ServletContextListener はあなたが実装するインターフェースです。新しいクラス ウィザードでは、Eclipse はインターフェイスの追加セクションでそれを提供する必要があります。

そのいくつかがあなたの問題のいくつかを解決することを願っています. 私はこのことにかなり慣れていません!

于 2012-11-29T13:16:37.513 に答える