web-dev-qa-db-fra.com

Quelle version de Jersey dois-je télécharger pour JDK 1.9?

J'utilise jdk 1.9. J'essaie de créer un simple service ReST. Créé le projet en utilisant l'archétype maven: jersey-quickstart-webapp. Ensuite, j'ai modifié les fichiers pom.xml et web.xml. Ma configuration de Maven est comme indiqué ci-dessous:

<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 fichier 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 j'essaie d'appuyer sur cette URL: http: // localhost: 8080/webapi/myresource - l'erreur d'erreur suivante s'affiche:

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)

Quand 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, Project SDK - 9, Niveau de langue du projet - 9

Quels pots dois-je importer pour que cela fonctionne avec 1.9? Ou dois-je modifier la configuration de Maven pour que cela fonctionne?

EDIT: Arbre de dépendance

[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] ------------------------------------------------------------------------
6
Rahul Dev Mishra

Le problème que Jersey actuel a une dépendance ombrée asm 5, qui ne fonctionne pas avec le bytecode Java 9. On dirait que Jersey 1.x n’est pas adopté pour Java 9 et il n’est pas clair si cette prise en charge est imminente. En tant que solution temporaire, j'ai créé un répertoire branch où j'ai supprimé asm ombré, les packages migrés dans le code afin d'utiliser une dépendance asm régulière et de mettre asm 6.0 dans les dépendances maven.

Vous ne pouvez créer que des modules jersey-server et jersey-servlet à partir de cette branche, car seuls ces deux dépendent d'Asm et utilisent ces deux artefacts personnalisés dans votre projet.

Mes projets fonctionnent bien avec un tel remplacement, mais je ne peux pas garantir qu'il s'agisse d'une solution à 100%, je n'ai pas été capable de construire toute la distribution sans échec et je ne peux pas investir du temps pour une adoption complète et une vérification pour le moment. Dans le même temps, les principales pièces de Jersey ont été construites sans problèmes.

Ainsi, votre pom final 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>
2

Vous devrez peut-être mettre à jour plusieurs artefacts. Pour commencer, vous devrez vérifier le mvn dependency:tree de votre module pour rechercher toute source de asm apportant la version < 6.0.x, car celle-ci n'est pas compatible avec Java9. À partir du pom.xml actuel et comme 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>

Surtout, utilisez les plugins maven compatibles Java 9 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>

Sur une note de côté, vous pourriez vous retrouver face à d’autres défis (je peux voir des dépendances jaxb en conflit, même asm pourrait être transitif de jersey) pour résoudre ce que vous devrez exécuter

mvn dependency:analyze

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

1
nullpointer

J'avais cette erreur et dans mon cas, cela n'avait rien à voir avec la version de Jersey. Cela était dû à certains bocaux à recherche élastique (à savoir: recherche élastique, noyau de recherche élastique et log4j.2.1.1) qui étaient des bocaux à largeurs multiples. Les fichiers jar à libération multiple ont un dossier nommé version qui contient des artefacts à l'intérieur du META-INF. J'ai supprimé ce dossier et le problème a été résolu.

Java #jersey #rest #elasticsearch

0
Mikematic