2013-04-20 118 views
2

我正在創建一個基於Jersey + Spring +休眠的REST API。 部署時一切正常。java.lang.IncompatibleClassChangeError與嵌入式Jetty和澤西島(無GAE)

我嘗試添加使用RestAssured一些集成測試,我想從一個嵌入式碼頭(強制性規範),但是它總是給這個錯誤啓動(見下文的詳細堆棧跟蹤):

20-04-2013 | 19:14:43 | WARN | (Slf4jLog.java:76) | failed jersey-servlet: java.lang.IncompatibleClassChangeError: Implementing class 
20-04-2013 | 19:14:43 | WARN | (Slf4jLog.java:76) | failed [email protected]{/test-core,src/main/webapp}: java.lang.IncompatibleClassChangeError: Implementing class 
20-04-2013 | 19:14:43 | ERROR | (Slf4jLog.java:87) | Error starting handlers 

由於該錯誤說這可能是我的SpringServlet,但我似乎無法解決這個問題。

我的雙響炮:

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd"> 
<modelVersion>4.0.0</modelVersion> 
<groupId>com.testing.system</groupId> 
<artifactId>testing-core</artifactId> 
<packaging>war</packaging> 
<version>1.0-SNAPSHOT</version> 
<name>testing-core</name> 
<properties> 
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> 
</properties> 

<dependencies> 
    <dependency> 
     <groupId>junit</groupId> 
     <artifactId>junit</artifactId> 
     <version>4.8.2</version> 
     <scope>test</scope> 
    </dependency> 

    <!-- Jersey --> 
    <dependency> 
     <groupId>com.sun.jersey</groupId> 
     <artifactId>jersey-server</artifactId> 
     <version>1.17.1</version> 
     <exclusions> 
      <exclusion> 
       <groupId>asm</groupId> 
       <artifactId>asm</artifactId> 
      </exclusion> 
     </exclusions> 
    </dependency> 

    <dependency> 
     <groupId>com.sun.jersey</groupId> 
     <artifactId>jersey-json</artifactId> 
     <version>1.17.1</version> 
    </dependency> 

    <dependency> 
     <groupId>com.sun.jersey</groupId> 
     <artifactId>jersey-servlet</artifactId> 
     <version>1.17.1</version> 
    </dependency> 

    <!-- Jersey + Spring --> 
    <dependency> 
     <groupId>com.sun.jersey.contribs</groupId> 
     <artifactId>jersey-spring</artifactId> 
     <version>1.17.1</version> 
     <exclusions> 
      <exclusion> 
       <groupId>org.springframework</groupId> 
       <artifactId>spring</artifactId> 
      </exclusion> 
      <exclusion> 
       <groupId>org.springframework</groupId> 
       <artifactId>spring-core</artifactId> 
      </exclusion> 
      <exclusion> 
       <groupId>org.springframework</groupId> 
       <artifactId>spring-web</artifactId> 
      </exclusion> 
      <exclusion> 
       <groupId>org.springframework</groupId> 
       <artifactId>spring-beans</artifactId> 
      </exclusion> 
      <exclusion> 
       <groupId>org.springframework</groupId> 
       <artifactId>spring-context</artifactId> 
      </exclusion> 
      <exclusion> 
       <groupId>org.springframework</groupId> 
       <artifactId>spring-aop</artifactId> 
      </exclusion> 
      <exclusion> 
       <groupId>org.springframework</groupId> 
       <artifactId>spring-asm</artifactId> 
      </exclusion> 
     </exclusions> 
    </dependency> 

    <!-- Spring stuff, TODO: cleanup --> 
    <dependency> 
     <groupId>org.springframework</groupId> 
     <artifactId>spring-core</artifactId> 
     <version>3.2.0.RELEASE</version> 
    </dependency> 


    <dependency> 
     <groupId>org.springframework</groupId> 
     <artifactId>spring-aop</artifactId> 
     <version>3.2.0.RELEASE</version> 
    </dependency> 

    <dependency> 
     <groupId>org.springframework</groupId> 
     <artifactId>spring-web</artifactId> 
     <version>3.2.0.RELEASE</version> 
    </dependency> 

    <dependency> 
     <groupId>org.springframework</groupId> 
     <artifactId>spring-context</artifactId> 
     <version>3.2.0.RELEASE</version> 
    </dependency> 

    <dependency> 
     <groupId>org.springframework</groupId> 
     <artifactId>spring-orm</artifactId> 
     <version>3.2.0.RELEASE</version> 
    </dependency> 

    <dependency> 
     <groupId>org.springframework</groupId> 
     <artifactId>org.springframework.test</artifactId> 
     <version>3.2.0.RELEASE</version> 
     <scope>test</scope> 
    </dependency> 


    <!-- Spring security --> 
    <dependency> 
     <groupId>org.springframework.security</groupId> 
     <artifactId>spring-security-core</artifactId> 
     <version>3.1.3.RELEASE</version> 
    </dependency> 
    <dependency> 
     <groupId>org.springframework.security</groupId> 
     <artifactId>spring-security-web</artifactId> 
     <version>3.1.3.RELEASE</version> 
    </dependency> 
    <dependency> 
     <groupId>org.springframework.security</groupId> 
     <artifactId>spring-security-config</artifactId> 
     <version>3.1.3.RELEASE</version> 
    </dependency> 

    <dependency> 
     <groupId>org.springframework.security.oauth</groupId> 
     <artifactId>spring-security-oauth</artifactId> 
     <version>1.0.0.M4</version> 
    </dependency> 

    <!-- Persistance ORM --> 
    <dependency> 
     <groupId>org.hibernate</groupId> 
     <artifactId>hibernate-entitymanager</artifactId> 
     <version>4.2.0.Final</version> 
     <!-- will come with Hibernate core --> 

    </dependency> 

    <!-- Database drivers, etc --> 
    <dependency> 
     <groupId>mysql</groupId> 
     <artifactId>mysql-connector-java</artifactId> 
     <version>5.1.9</version> 
    </dependency> 

    <dependency> 
     <groupId>com.h2database</groupId> 
     <artifactId>h2</artifactId> 
     <version>1.0.60</version> 
    </dependency> 

    <dependency> 
     <groupId>com.jolbox</groupId> 
     <artifactId>bonecp</artifactId> 
     <version>0.7.1.RELEASE</version> 
    </dependency> 

    <!-- used for testing --> 
    <dependency> 
     <groupId>org.apache.tomcat.embed</groupId> 
     <artifactId>tomcat-embed-core</artifactId> 
     <version>7.0.37</version> 
     <scope>test</scope> 
    </dependency> 
    <dependency> 
     <groupId>org.apache.tomcat</groupId> 
     <artifactId>tomcat-catalina</artifactId> 
     <version>7.0.37</version> 
     <scope>test</scope> 
    </dependency> 
    <dependency> 
     <groupId>org.apache.tomcat</groupId> 
     <artifactId>tomcat-jasper</artifactId> 
     <version>7.0.37</version> 
     <scope>test</scope> 
    </dependency> 

    <dependency> 
     <groupId>org.mortbay.jetty</groupId> 
     <artifactId>jetty</artifactId> 
     <version>6.1.26</version> 
    </dependency> 

    <dependency> 
     <groupId>com.jayway.restassured</groupId> 
     <artifactId>rest-assured</artifactId> 
     <version>1.8.0</version> 
     <scope>test</scope> 
    </dependency> 

    <!-- spy driver used to provide a layer between the service/dao layer and the real jdbc driver --> 
    <dependency> 
     <groupId>p6spy</groupId> 
     <artifactId>p6spy</artifactId> 
     <version>1.3</version> 
    </dependency> 

    <!-- Logging --> 
    <dependency> 
     <groupId>org.slf4j</groupId> 
     <artifactId>slf4j-log4j12</artifactId> 
     <version>1.5.10</version> 
    </dependency> 

    <!-- Mocking --> 
    <dependency> 
     <groupId>org.mockito</groupId> 
     <artifactId>mockito-all</artifactId> 
     <version>1.9.5</version> 
     <scope>test</scope> 
    </dependency> 

    <!-- Other --> 
    <dependency> 
     <groupId>org.apache.commons</groupId> 
     <artifactId>commons-io</artifactId> 
     <version>1.3.2</version> 
    </dependency> 
    <dependency> 
     <groupId>org.apache.commons</groupId> 
     <artifactId>commons-lang3</artifactId> 
     <version>3.1</version> 
    </dependency> 

    <dependency> 
     <groupId>asm</groupId> 
     <artifactId>asm</artifactId> 
     <version>3.3.1</version> 
    </dependency> 

    <dependency> 
     <groupId>org.apache.httpcomponents</groupId> 
     <artifactId>httpclient</artifactId> 
     <version>4.2.3</version> 
     <scope>compile</scope> 
    </dependency> 

    <!-- spring social --> 
    <dependency> 
     <groupId>org.springframework.social</groupId> 
     <artifactId>spring-social-core</artifactId> 
     <version>1.0.2.RELEASE</version> 
    </dependency> 

    <dependency> 
     <groupId>org.springframework.social</groupId> 
     <artifactId>spring-social-facebook</artifactId> 
     <version>1.0.2.RELEASE</version> 
    </dependency> 

    <!--  <dependency> 
      <groupId>org.codehaus.jackson</groupId> 
      <artifactId>jackson-core-asl</artifactId> 
      <version>1.9.11</version> 
     </dependency> 

     <dependency> 
      <groupId>org.codehaus.jackson</groupId> 
      <artifactId>jackson-mapper-asl</artifactId> 
      <version>1.9.11</version> 
     </dependency> --> 

</dependencies> 
<build> 
    <finalName>testing-core</finalName> 
    <resources> 
     <resource> 
      <directory>src/main/resources</directory> 
      <filtering>true</filtering> 
     </resource> 
    </resources> 
    <testResources> 
     <testResource> 
      <directory>src/test/resources</directory> 
      <filtering>true</filtering> 
     </testResource> 
    </testResources> 

    <plugins> 
     <plugin> 
      <groupId>org.apache.maven.plugins</groupId> 
      <artifactId>maven-compiler-plugin</artifactId> 
      <version>3.0</version> 
      <configuration> 
       <source>1.7</source> 
       <target>1.7</target> 
      </configuration> 
     </plugin> 
    </plugins> 
</build> 

<profiles> 
    <profile> 
     <id>local</id> 
     <activation> 
      <activeByDefault>true</activeByDefault> 
     </activation> 
     <properties> 
      <system.properties>system_local.properties</system.properties> 
      <database.properties>database_local.properties</database.properties> 
     </properties> 
    </profile> 
    <profile> 
     <id>dev</id> 
     <properties> 
      <system.properties>system_dev.properties</system.properties> 
      <database.properties>database_dev.properties</database.properties> 
     </properties> 
    </profile> 
</profiles> 

這裏是我的web.xml:

<web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"> 

<context-param> 
    <param-name>contextConfigLocation</param-name> 
    <param-value>classpath:applicationContext.xml</param-value> 
</context-param> 

<listener> 
    <listener-class> 
     org.springframework.web.context.ContextLoaderListener 
    </listener-class> 
</listener> 

<servlet> 
    <servlet-name>jersey-servlet</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.testing.core.resources;com.testing.core.exceptions</param-value> 
    </init-param> 
    <init-param> 
     <param-name>com.sun.jersey.spi.container.ResourceFilters</param-name> 
     <param-value>com.testing.core.filters.SecureFilterFactory</param-value> 
    </init-param> 
    <init-param> 
     <param-name>com.sun.jersey.api.json.POJOMappingFeature</param-name> 
     <param-value>true</param-value> 
    </init-param> 
    <load-on-startup>1</load-on-startup> 
</servlet> 

<!-- Security filter --> 
<filter> 
    <filter-name>springSecurityFilterChain</filter-name> 
    <filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class> 
</filter> 

<filter-mapping> 
    <filter-name>springSecurityFilterChain</filter-name> 
    <url-pattern>/rest/*</url-pattern> 
</filter-mapping> 

<!-- Mapping of the rest URL /rest/* --> 
<servlet-mapping> 
    <servlet-name>jersey-servlet</servlet-name> 
    <url-pattern>/rest/*</url-pattern> 
</servlet-mapping> 

和類的最終方法(類WithJetty是獲取擴展一個JUnit測試)將啓動我的碼頭服務器:

@BeforeClass 
public static void startJetty() throws Exception { 
    server = new Server(8070); 

    WebAppContext context = new WebAppContext(); 
    context.setDescriptor("src/main/webapp/WEB-INF/web.xml"); 
    context.setWar("src/main/webapp"); 
    context.setParentLoaderPriority(true); 
    context.setContextPath("/testing-core"); 

    server.setHandler(context); 
    server.setStopAtShutdown(true); 
    server.start(); 
} 

的實際工作中的測試用例是很基本的:

public class UserResourceTest extends WithJetty { 
    @Test 
    public void test() throws Exception { 
     Assert.assertEquals(200, given().log().all().get(RSConstants.PATH_UNSECURED + "/test").getStatusCode()); 
    } 
} 

更完整的堆棧跟蹤

java.lang.IncompatibleClassChangeError: Implementing class 
at java.lang.ClassLoader.defineClass1(Native Method) 
at java.lang.ClassLoader.defineClass(ClassLoader.java:791) 
at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:142) 
at java.net.URLClassLoader.defineClass(URLClassLoader.java:449) 
at java.net.URLClassLoader.access$100(URLClassLoader.java:71) 
at java.net.URLClassLoader$1.run(URLClassLoader.java:361) 
at java.net.URLClassLoader$1.run(URLClassLoader.java:355) 
at java.security.AccessController.doPrivileged(Native Method) 
at java.net.URLClassLoader.findClass(URLClassLoader.java:354) 
at java.lang.ClassLoader.loadClass(ClassLoader.java:423) 
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:308) 
at java.lang.ClassLoader.loadClass(ClassLoader.java:356) 
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:203) 
at com.sun.jersey.spi.container.servlet.ServletContainer.init(ServletContainer.java:374) 
at com.sun.jersey.spi.container.servlet.ServletContainer.init(ServletContainer.java:557) 
at javax.servlet.GenericServlet.init(GenericServlet.java:160) 
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:736) 
at org.mortbay.jetty.servlet.Context.startContext(Context.java:140) 
at org.mortbay.jetty.webapp.WebAppContext.startContext(WebAppContext.java:1282) 
at org.mortbay.jetty.handler.ContextHandler.doStart(ContextHandler.java:518) 
at org.mortbay.jetty.webapp.WebAppContext.doStart(WebAppContext.java:499) 
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 testutils.WithJetty.startJetty(WithJetty.java:52) 

我已經走遍了互聯網和StackOverflow上可行的解決方案,但他們都我發現有一些東西與GAE(我不使用)

非常感謝您的幫助!

+0

我確信我的開發JDK是java 7,可惜問題依然存在。 – Sem 2013-04-26 13:23:10

回答

0

我試圖從1.7.2升級到1.8.0或更新版本時遇到同樣的問題。所以我建議降級到1.7.2作爲解決方法,直到提供更好的解決方案。