泽西岛REST服务失败:java.lang.IncompatibleClassChangeError:实现类 [英] failed Jersey REST Service: java.lang.IncompatibleClassChangeError: Implementing class

查看:94
本文介绍了泽西岛REST服务失败:java.lang.IncompatibleClassChangeError:实现类的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我希望Jersey可以轻松部署到Google App Engine,因为它可以支持( http://code.google.com/p/googleappengine/wiki/WillItPlayInJava )和几个人提到他们使其工作( http://tugdualgrall.blogspot.ca/2010/02/create-and-deploy-jax-rs-rest-service .html
但它不起作用...




  • 我使用gae插件创建了一个新项目对于eclipse(使用gae sdk 1.7.3)

  • 我添加到了我的web.xml中:

     < servlet的> 
    < servlet-name> Jersey REST服务< / servlet-name>
    < servlet-class> com.sun.jersey.spi.container.servlet.ServletContainer< / servlet-class>
    < init-param>
    < param-name> com.sun.jersey.config.property.packages< / param-name>
    < param-value> sample.hello.resources< / param-value>
    < / init-param>
    < init-param>
    < param-name> com.sun.jersey.config.feature.DisableWADL< / param-name>
    < param-value> true< /参数值>
    < / init-param>
    <加载启动> 1< /加载启动>
    < / servlet>


  • 我添加到classpath:jersey-bundle-1.14.jar只有核心,servlet和服务器,我甚至尝试过1.5)




但我仍然坚持这样:

 警告:失败Jersey REST服务:java.lang.IncompatibleClassChangeError:实现类
Oct 27,2012 6:17 :06 PM com.google.apphosting.utils.jetty.JettyLogger警告
警告:失败com.google.appengine.tools.development.DevAppEngineWebAppContext@68c12474 {/,/ Users / anthony / workspaces / gae / restfulapp / war }:java.lang.IncompatibleClassChangeError:实现类
2012年10月27日下午6时17分06秒com.google.apphosting.utils.jetty.JettyLogger警告
警告:失败JettyContainerService $ @ ApiProxyHandler 365878d2:JAVA .lang.IncompatibleClassChangeError:实现类
2012年10月27日下午6时17分06秒com.google.apphosting.utils.jetty.JettyLogger警告
警告:错误启动处理程序
java。 lang.IncompatibleClassChangeError:在java.lang中的java.lang.ClassLoader.defineClassCond在java.lang.ClassLoader.defineClass1实现类
(本机方法)
(ClassLoader.java:631)
。 ClassLoader.defineClass(ClassLoader.java:615)$ java.util.SecureClassLoader.defineClass(SecureClassLoader.java:141)
在java.net.URLClassLoader.defineClass(URLClassLoader.java:283)

。在java.net.URLClassLoader.access $ 000(URLClassLoader.java:58)$ b $在java.net.URLClassLoader的$ 1.run(URLClassLoader.java:197)$ b $在java.security.AccessController.doPrivileged b b (本地方法)$ java $。
在java.net.URLClassLoader.findClass(URLClassLoader.java:190)
在java.lang.ClassLoader.loadClass(ClassLoader.java:306)
在com.google .appealine.tools.development.IsolatedAppClassLoader.loadClass(IsolatedAppClassLoader.java:207)$ b $在java.lang.ClassLoader.loadClass(ClassLoader.java:247)
在com.sun.jersey.api.core .ScanningResourceConfig .init(ScanningResourceConfig.java:79)
at com.sun.jersey.api.core.PackagesResourceConfig.init(PackagesResourceConfig.java:104)
at com.sun.jersey.api.core.PackagesResourceConfig 。< init>(PackagesResourceConfig.java:78)
at com.sun.jersey.api.core.PackagesResourceConfig。< init>(PackagesResourceConfig.java:89)
at com.sun.jersey .spi.container.servlet.WebComponent.createResourceConfig(WebComponent.java:696)
at com.sun.jersey.spi.container.servlet.WebComponent.createResourceConfig(WebComponent.java:674)
at com .sun.jersey.spi.container.servlet.WebComponent.init(WebComponent.java:206)
at com.sun.jersey.spi.container.servlet.ServletContainer.init(ServletContainer.java:373)
在com.sun.jersey.spi.container.servlet.ServletContainer.init(ServletContainer.java:556)$ b $在javax.servlet.GenericServlet.init(GenericServlet.java:212)
在org .mortbay.jetty.servlet.ServletHolder.initServlet(ServletHolder.java:440)在org.mortbay.jetty.servlet.ServletHolder.doStart(ServletHolder.java:263)

在org.mortbay.component.AbstractLifeCycle.start(AbstractLifeCycle.java:50)
。在组织.mortbay.jetty.servlet.ServletHandler.initialize(ServletHandler.java:685)
在org.mortbay.jetty.servlet.Context.startContext(Context.java:140)
在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)在org.mortbay.component.AbstractLifeCycle.start(AbstractLifeCycle.java:50

在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)
com.google.appengine.tools.development.JettyContainerService.startContainer(JettyContainerService.java:205)
at com。 google.appengine.tools.development.AbstractContainerService.startup(AbstractContainerService.java:249)
,位于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)
,位于com.google.appengine.tools.development.DevAppServerMain。< init>(DevAppServerMain.java:269)
,位于com.google.appengine.tools.development.DevAppServerMain.main(DevAppServerMain.java:245)

我错过了什么?我应该为gae使用另一个jax-rs实现吗?
感谢您的回答!

解决方案

好吧,我发现:显然(看着我发布的堆栈跟踪问题),GAE不允许Jersey使用它的类加载器来扫描可用的剩余资源。
所以,我详细阅读了泽西岛的文档泽西岛关于部署的文档,我发现我可以手动为Jersey指定Rest资源。



以下是web.xml:

 < servlet-mapping> 
< servlet-name> Jersey Web Application< / servlet-name>
< url-pattern> / rest / *< / url-pattern>
< / servlet-mapping>
< servlet>
< servlet-name> Jersey Web Application< / servlet-name>
< servlet-class> com.sun.jersey.spi.container.servlet.ServletContainer
< / servlet-class>
< init-param>
< param-name> javax.ws.rs.Application< / param-name>
< param-value> sample.hello.bean.MyApplication< / param-value>
< / init-param>
< / servlet>

您可以注意到我现在有一个Application类:

  package sample.hello.bean; 

import java.util.HashSet;
import java.util.Set;

import javax.ws.rs.core.Application;

导入sample.hello.resources.HelloResource;

public class MyApplication extends Application {
public Set< Class<>> getClasses(){
Set< Class<?>> s = new HashSet< Class<>>();
s.add(HelloResource.class);
return s;




$ b $ p
$ b

只需手动指定您的剩余资源,然后将它们添加到集合中。
适用于jersey-bundle-1.14.jar


I was hopeful that Jersey would deploy easily to Google App Engine, as it is supposedly supported ( http://code.google.com/p/googleappengine/wiki/WillItPlayInJava ) and several people mention they made it work ( http://tugdualgrall.blogspot.ca/2010/02/create-and-deploy-jax-rs-rest-service.html) But it does not work...

  • I created a new project with the gae plugin for eclipse (using gae sdk 1.7.3)
  • I added to my web.xml :

    <servlet>
    <servlet-name>Jersey REST Service</servlet-name>
    <servlet-class>com.sun.jersey.spi.container.servlet.ServletContainer</servlet-class>
    <init-param>
      <param-name>com.sun.jersey.config.property.packages</param-name>
      <param-value>sample.hello.resources</param-value>
    </init-param>
    <init-param>
      <param-name>com.sun.jersey.config.feature.DisableWADL</param-name>
      <param-value>true</param-value>
    </init-param>
    <load-on-startup>1</load-on-startup>
    </servlet>
    

  • I added to the classpath : jersey-bundle-1.14.jar (I even tried with only core, servlet, and server AND I even tried with 1.5 only)

but I still get stuck with this :

      WARNING: failed Jersey REST Service: java.lang.IncompatibleClassChangeError: Implementing class
  Oct 27, 2012 6:17:06 PM com.google.apphosting.utils.jetty.JettyLogger warn
  WARNING: failed com.google.appengine.tools.development.DevAppEngineWebAppContext@68c12474{/,/Users/anthony/workspaces/gae/restfulapp/war}: java.lang.IncompatibleClassChangeError: Implementing class
  Oct 27, 2012 6:17:06 PM com.google.apphosting.utils.jetty.JettyLogger warn
  WARNING: failed JettyContainerService$ApiProxyHandler@365878d2: java.lang.IncompatibleClassChangeError: Implementing class
  Oct 27, 2012 6:17:06 PM com.google.apphosting.utils.jetty.JettyLogger warn
  WARNING: Error starting handlers
  java.lang.IncompatibleClassChangeError: Implementing class
    at java.lang.ClassLoader.defineClass1(Native Method)
    at java.lang.ClassLoader.defineClassCond(ClassLoader.java:631)
    at java.lang.ClassLoader.defineClass(ClassLoader.java:615)
    at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:141)
    at java.net.URLClassLoader.defineClass(URLClassLoader.java:283)
    at java.net.URLClassLoader.access$000(URLClassLoader.java:58)
    at java.net.URLClassLoader$1.run(URLClassLoader.java:197)
    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 com.sun.jersey.api.core.ScanningResourceConfig.init(ScanningResourceConfig.java:79)
    at com.sun.jersey.api.core.PackagesResourceConfig.init(PackagesResourceConfig.java:104)
    at com.sun.jersey.api.core.PackagesResourceConfig.<init>(PackagesResourceConfig.java:78)
    at com.sun.jersey.api.core.PackagesResourceConfig.<init>(PackagesResourceConfig.java:89)
    at com.sun.jersey.spi.container.servlet.WebComponent.createResourceConfig(WebComponent.java:696)
    at com.sun.jersey.spi.container.servlet.WebComponent.createResourceConfig(WebComponent.java:674)
    at com.sun.jersey.spi.container.servlet.WebComponent.init(WebComponent.java:206)
    at com.sun.jersey.spi.container.servlet.ServletContainer.init(ServletContainer.java:373)
    at com.sun.jersey.spi.container.servlet.ServletContainer.init(ServletContainer.java:556)
    at javax.servlet.GenericServlet.init(GenericServlet.java:212)
    at org.mortbay.jetty.servlet.ServletHolder.initServlet(ServletHolder.java:440)
    at org.mortbay.jetty.servlet.ServletHolder.doStart(ServletHolder.java:263)
    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)

What did I miss ? Should I use another jax-rs implementation for gae ? Thanks for your answers !

解决方案

OK, I found out : apparently (looking at the stack trace I posted in the question) , GAE did not allow Jersey to use its classloader to scan the available rest resources. So, I read in detail the Jersey documentation the Jersey documentation regarding the deployments and I found out that I can manually specify the Rest resources to Jersey.

Here is the web.xml :

<servlet-mapping>
<servlet-name>Jersey Web Application</servlet-name>
<url-pattern>/rest/*</url-pattern>
</servlet-mapping>
<servlet>
<servlet-name>Jersey Web Application</servlet-name>
<servlet-class>com.sun.jersey.spi.container.servlet.ServletContainer
</servlet-class>
<init-param>
  <param-name>javax.ws.rs.Application</param-name>
  <param-value>sample.hello.bean.MyApplication</param-value>
</init-param>
</servlet>

You can notice I now have an Application class :

    package sample.hello.bean;

    import java.util.HashSet;
    import java.util.Set;

    import javax.ws.rs.core.Application;

    import sample.hello.resources.HelloResource;

    public class MyApplication extends Application {
         public Set<Class<?>> getClasses() {
             Set<Class<?>> s = new HashSet<Class<?>>();
             s.add(HelloResource.class);
             return s;
         }
    }

Just specify manually your rest resources adding them to the set. Works with jersey-bundle-1.14.jar

这篇关于泽西岛REST服务失败:java.lang.IncompatibleClassChangeError:实现类的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
相关文章
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆