2017-10-15 8 views
4

J'utilise jdk 1.9. J'essaie d'évoquer un service ReST simple. Créé le projet en utilisant l'archétype maven: jersey-quickstart-webapp. Ensuite, je suis allé de l'avant et modifié le pom.xml et web.xml. Ma config Maven est comme indiqué ci-dessous:Quelle version de Jersey ai-je besoin de télécharger pour 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> 

Et le web.xml ressemble à ceci:

<?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> 

Lorsque je tente de frapper cette URL: http://localhost:8080/webapi/myresource - Je vois l'erreur suivante:

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) 

Lorsque je change la configuration de construction de 1,9 à 1,8

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

le service arrive sans aucun problème et je vois le résultat attendu sur le navigateur.

J'utilise Intellij, SDK Project - 9, Langue de projet Niveau - 9

Que dois-je importer des pots afin de le faire fonctionner avec 1,9? Ou dois-je changer la configuration de maven pour le faire fonctionner?

EDIT: l'arbre des dépendances

[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] ------------------------------------------------------------------------ 

Répondre

2

Il y a bien peu d'artefacts que vous pourriez avoir besoin de mettre à jour. Pour commencer, vous devez vérifier mvn dependency:tree de votre module pour trouver une source de asm qui apporte la version < 6.0.x puisque ce n'est pas compatible avec Java9. À partir du courant pom.xml et en déduit de vos journaux d'exécution, vous pouvez mettre à jour

<!-- 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> 

Il est important, utiliser Java 9 compatible maven plugins tels que -

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

D'un côté, vous pourrait finir encore face à d'autres défis (je peux voir en conflit jaxb dépendances, même asm pourrait être transitif de jersey) pour résoudre que vous accourront

mvn dependency:analyze 

et assurez-vous que les dépendances en conflit sont exclues dans ce cas pour faire utilisation de leur version mise à jour.

+0

Merci pour la suggestion. Mais je vois la même erreur après avoir incorporé vos changements dans le pom.xml –

+0

@RahulDevMishra Avez-vous essayé et compris l'arbre de dépendance n'apportant pas 'asm' de toute autre source comme mentionné dans la réponse? – nullpointer

+0

Laissez-moi le faire maintenant –

1

Le problème que Jersey actuel a une dépendance asm 5 ombrée, qui ne fonctionne pas avec Java 9 bytecode. On dirait que Jersey 1.x n'est pas adopté par Java 9 et il n'est pas clair si ce support arrive. Comme une solution temporaire, j'ai fait un branch où j'ai supprimé shaded asm, migré des paquets dans le code pour utiliser une dépendance asm régulière et mettre asm 6.0 dans les dépendances maven.

Vous pouvez créer uniquement des modules jersey-server et jersey-servlet à partir de cette branche, car seuls ces deux éléments dépendent d'asm et utilisent ces deux artefacts personnalisés dans votre projet.Mes projets fonctionnent très bien avec un tel remplacement, mais je ne peux pas garantir que c'est 100% de solution de travail, je n'ai pas pu construire toute la distribution sans échouer et je ne peux pas investir du temps pour une adoption complète et vérifier maintenant. Dans le même temps, les pièces principales de Jersey construites sans problèmes.

Ainsi, votre pom finale ressemblerait à ceci:

<!--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>