2017-10-15 135 views
4

我正在使用jdk 1.9。我正在尝试提出一个简单的ReST服务。使用maven原型创建项目:jersey-quickstart-webapp。然后我继续并修改了pom.xml和web.xml。我的Maven的配置如下图所示:我需要为JDK 1.9下载什么泽西版本?

<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>restWebService</groupId> 
    <artifactId>restWebService</artifactId> 
    <packaging>war</packaging> 
    <version>1.0-SNAPSHOT</version> 
    <name>restWebService</name> 

    <build> 
     <finalName>restWebService</finalName> 
     <plugins> 
      <plugin> 
       <groupId>org.apache.maven.plugins</groupId> 
       <artifactId>maven-compiler-plugin</artifactId> 
       <version>3.7.0</version> 
       <inherited>true</inherited> 
       <configuration> 
        <source>9</source> 
        <target>9</target> 
       </configuration> 
      </plugin> 
     </plugins> 
    </build> 

    <dependencyManagement> 
     <dependencies> 
      <dependency> 
       <groupId>org.glassfish.jersey</groupId> 
       <artifactId>jersey-bom</artifactId> 
       <version>${jersey.version}</version> 
       <type>pom</type> 
       <scope>import</scope> 
      </dependency> 
     </dependencies> 
    </dependencyManagement> 

    <dependencies> 
     <!-- https://mvnrepository.com/artifact/org.springframework/spring-core --> 
     <dependency> 
      <groupId>org.springframework</groupId> 
      <artifactId>spring-core</artifactId> 
      <version>5.0.0.RELEASE</version> 
     </dependency> 

     <!-- https://mvnrepository.com/artifact/com.sun.jersey/jersey-client --> 
     <dependency> 
      <groupId>com.sun.jersey</groupId> 
      <artifactId>jersey-client</artifactId> 
      <version>1.19.4</version> 
     </dependency> 

     <!-- https://mvnrepository.com/artifact/com.sun.jersey/jersey-bundle --> 
     <dependency> 
      <groupId>com.sun.jersey</groupId> 
      <artifactId>jersey-bundle</artifactId> 
      <version>1.19.4</version> 
     </dependency> 

     <!-- https://mvnrepository.com/artifact/com.sun.jersey/jersey-server --> 
     <dependency> 
      <groupId>com.sun.jersey</groupId> 
      <artifactId>jersey-server</artifactId> 
      <version>1.19.4</version> 
     </dependency> 

     <!-- https://mvnrepository.com/artifact/com.sun.jersey/jersey-core --> 
     <dependency> 
      <groupId>com.sun.jersey</groupId> 
      <artifactId>jersey-core</artifactId> 
      <version>1.19.4</version> 
     </dependency> 

     <!-- https://mvnrepository.com/artifact/asm/asm --> 
     <dependency> 
      <groupId>org.ow2.asm</groupId> 
      <artifactId>asm</artifactId> 
      <version>6.0_BETA</version> 
     </dependency> 

     <!-- https://mvnrepository.com/artifact/org.json/json --> 
     <dependency> 
      <groupId>org.json</groupId> 
      <artifactId>json</artifactId> 
      <version>20170516</version> 
     </dependency> 

     <!-- https://mvnrepository.com/artifact/com.sun.xml.bind/jaxb-impl --> 
     <dependency> 
      <groupId>com.sun.xml.bind</groupId> 
      <artifactId>jaxb-impl</artifactId> 
      <version>2.3.0</version> 
     </dependency> 

     <!-- https://mvnrepository.com/artifact/javax.xml/jaxb-api --> 
     <dependency> 
      <groupId>javax.xml</groupId> 
      <artifactId>jaxb-api</artifactId> 
      <version>2.1</version> 
     </dependency> 

     <!-- https://mvnrepository.com/artifact/javax.activation/activation --> 
     <dependency> 
      <groupId>javax.activation</groupId> 
      <artifactId>activation</artifactId> 
      <version>1.1.1</version> 
     </dependency> 

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

     <!-- https://mvnrepository.com/artifact/com.sun.xml.bind/jaxb-core --> 
     <dependency> 
      <groupId>com.sun.xml.bind</groupId> 
      <artifactId>jaxb-core</artifactId> 
      <version>2.3.0</version> 
     </dependency> 

    </dependencies> 
    <properties> 
     <jersey.version>2.16</jersey.version> 
     <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> 
    </properties> 
</project> 

而且web.xml文件看起来是这样的:

<?xml version="1.0" encoding="UTF-8"?> 
<!-- This web.xml file is not required when using Servlet 3.0 container, 
    see implementation details http://jersey.java.net/nonav/documentation/latest/jax-rs.html --> 
<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"> 
    <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>restWebService</param-value> 
     </init-param> 
     <load-on-startup>1</load-on-startup> 
    </servlet> 
    <servlet-mapping> 
     <servlet-name>Jersey REST Service</servlet-name> 
     <url-pattern>/webapi/*</url-pattern> 
    </servlet-mapping> 
</web-app> 

当我尝试打这个网址:http://localhost:8080/webapi/myresource - 我看到了以下错误:

HTTP Status 500 – Internal Server Error 

Type Exception Report 

Message Servlet.init() for servlet [Jersey REST Service] threw exception 

Description The server encountered an unexpected condition that prevented it from fulfilling the request. 

Exception 

javax.servlet.ServletException: Servlet.init() for servlet [Jersey REST Service] threw exception 
    org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:475) 
    org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:81) 
    org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:651) 
    org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:342) 
    org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:500) 
    org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:66) 
    org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:754) 
    org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1376) 
    org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49) 
    java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1167) 
    java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:641) 
    org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) 
    java.base/java.lang.Thread.run(Thread.java:844) 
Root Cause 

java.lang.IllegalArgumentException 
    jersey.repackaged.org.objectweb.asm.ClassReader.<init>(ClassReader.java:170) 
    jersey.repackaged.org.objectweb.asm.ClassReader.<init>(ClassReader.java:153) 
    jersey.repackaged.org.objectweb.asm.ClassReader.<init>(ClassReader.java:424) 
    com.sun.jersey.spi.scanning.AnnotationScannerListener.onProcess(AnnotationScannerListener.java:138) 
    com.sun.jersey.core.spi.scanning.uri.FileSchemeScanner$1.f(FileSchemeScanner.java:86) 
    com.sun.jersey.core.util.Closing.f(Closing.java:71) 

当我改变从1.9构建配置1.8

<configuration> 
    <source>1.8</source> 
    <target>1.8</target> 
</configuration> 

服务出现没有任何问题,我在浏览器上看到预期的结果。

我使用的IntelliJ,项目SDK - 9,项目语言水平 - 9

我应该导入,以使其与1.9的工作是什么罐子?或者我需要更改maven配置以使其工作?

编辑:的依赖关系树

[INFO] Scanning for projects... 
[INFO]                   
[INFO] ------------------------------------------------------------------------ 
[INFO] Building restWebService 1.0-SNAPSHOT 
[INFO] ------------------------------------------------------------------------ 
[WARNING] The artifact javax.xml:jaxb-api:jar:2.1 has been relocated to javax.xml.bind:jaxb-api:jar:2.1 
[INFO] 
[INFO] --- maven-dependency-plugin:2.8:tree (default-cli) @ restWebService --- 
[WARNING] The artifact javax.xml:jaxb-api:jar:2.1 has been relocated to javax.xml.bind:jaxb-api:jar:2.1 
[INFO] restWebService:restWebService:war:1.0-SNAPSHOT 
[INFO] +- org.springframework:spring-core:jar:5.0.0.RELEASE:compile 
[INFO] | \- org.springframework:spring-jcl:jar:5.0.0.RELEASE:compile 
[INFO] +- com.sun.jersey:jersey-client:jar:1.19.4:compile 
[INFO] +- com.sun.jersey:jersey-bundle:jar:1.19.4:compile 
[INFO] | \- javax.ws.rs:jsr311-api:jar:1.1.1:compile 
[INFO] +- com.sun.jersey:jersey-server:jar:1.19.4:compile 
[INFO] +- com.sun.jersey:jersey-core:jar:1.19.4:compile 
[INFO] +- org.ow2.asm:asm:jar:6.0_BETA:compile 
[INFO] +- org.json:json:jar:20170516:compile 
[INFO] +- com.sun.xml.bind:jaxb-impl:jar:2.3.0:compile 
[INFO] +- javax.xml.bind:jaxb-api:jar:2.1:compile 
[INFO] | \- javax.xml.stream:stax-api:jar:1.0-2:compile 
[INFO] +- javax.activation:activation:jar:1.1.1:compile 
[INFO] +- com.sun.jersey:jersey-json:jar:1.19.4:compile 
[INFO] | +- org.codehaus.jettison:jettison:jar:1.1:compile 
[INFO] | +- org.codehaus.jackson:jackson-core-asl:jar:1.9.2:compile 
[INFO] | +- org.codehaus.jackson:jackson-mapper-asl:jar:1.9.2:compile 
[INFO] | +- org.codehaus.jackson:jackson-jaxrs:jar:1.9.2:compile 
[INFO] | \- org.codehaus.jackson:jackson-xc:jar:1.9.2:compile 
[INFO] \- com.sun.xml.bind:jaxb-core:jar:2.3.0:compile 
[INFO] ------------------------------------------------------------------------ 
[INFO] BUILD SUCCESS 
[INFO] ------------------------------------------------------------------------ 
[INFO] Total time: 1.910 s 
[INFO] Finished at: 2017-10-14T22:05:15-04:00 
[INFO] Final Memory: 13M/44M 
[INFO] ------------------------------------------------------------------------ 

回答

2

有不少,你可能需要更新一些文物。首先,你应该检查你的模块的mvn dependency:tree,以便注意asm的任何来源,因为它与Java9不兼容,所以引入版本< 6.0.x。从目前pom.xml并从你的执行日志推断,您可以更新

<!-- https://mvnrepository.com/artifact/asm/asm --> 
<dependency> 
    <groupId>asm</groupId> 
    <artifactId>asm</artifactId> 
    <version>3.3.1</version> 
</dependency> 

<dependency> 
    <groupId>org.ow2.asm</groupId> 
    <artifactId>asm</artifactId> 
    <version>6.0</version> 
</dependency> 

重要的是,使用Java 9 compatible maven plugins如 -

<plugin> 
    <groupId>org.apache.maven.plugins</groupId> 
    <artifactId>maven-compiler-plugin</artifactId> 
    <version>3.7.0</version> 
    <inherited>true</inherited> 
    <configuration> 
     <source>9</source> 
     <target>9</target> 
    </configuration> 
</plugin> 

在附注中,你可能最终仍面临其他一些挑战(我可以看到冲突的jaxb依赖,甚至asm可能是从jersey传递的)解决您应该运行

mvn dependency:analyze 

,并确保依赖性冲突而被排除在这种情况下,使使用他们的更新版本。

+0

感谢您的建议。但我看到包含在pom.xml –

+0

@RahulDevMishra更改你试着找出依赖关系树作为答复中提到没有任何其他来源带来'asm'以后同样的错误? – nullpointer

+0

现在让我来做 –

1

目前Jersey有一个阴影asm 5依赖项的问题,它不适用于Java 9字节码。看起来泽西岛1.x没有被采用到Java 9中,目前还不清楚这种支持是否会出现。作为一个临时解决方案,我制作了一个branch,我在其中删除了阴影asm,将代码中的包迁移到使用常规asm依赖项并将asm 6.0放入maven依赖项中。

您只能从这个分支构建jersey-server和jersey-servlet模块,因为只有这两个模块依赖asm并在项目中使用这两个自定义工件。

我的项目很好地工作这样的替换,但我不能保证它是100%的工作方案,我是不是能够建立整体分布没有失败,不能投资时间进行全面采用和检查马上。同时,主要的泽西岛部分没有问题。

所以,你最终的POM会是什么样子:

<!--regular jersey dependencies with the last 1.19.4 version--> 
<dependency> 
    <groupId>com.sun.jersey</groupId> 
    <artifactId>jersey-server</artifactId> 
    <version>${custom-jersey-with-asm6.version}</version> 
</dependency> 

<dependency> 
    <groupId>com.sun.jersey</groupId> 
    <artifactId>jersey-servlet</artifactId> 
    <version>${custom-jersey-with-asm6.version}</version> 
</dependency> 

<dependency> 
    <groupId>org.ow2.asm</groupId> 
    <artifactId>asm</artifactId> 
    <version>6.0</version> 
</dependency>