wake-up-neo.com

Welche Jersey-Version muss ich für JDK 1.9 herunterladen?

Ich benutze JDK 1.9. Ich versuche, einen einfachen ReST-Dienst aufzurufen. Erstellt das Projekt mit dem Maven-Archetyp: jersey-quickstart-webapp. Dann habe ich die Dateien pom.xml und web.xml geändert. Meine Maven-Konfiguration sieht wie folgt aus:

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

Und die web.xml sieht so aus:

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

Wenn ich versuche, diese URL zu erreichen: http: // localhost: 8080/webapi/myresource - wird der folgende Fehler angezeigt:

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)

Wenn ich die Build-Konfiguration von 1.9 auf 1.8 ändere

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

der Service läuft ohne Probleme und ich sehe das erwartete Ergebnis im Browser.

Ich verwende Intellij, Project SDK - 9, Project Language Level - 9

Welche Gläser sollte ich importieren, damit es mit 1.9 funktioniert? Oder muss ich die Maven-Konfiguration ändern, damit es funktioniert?

BEARBEITEN: Abhängigkeitsbaum

[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

Das Problem, dass das aktuelle Jersey eine schattierte ASM 5-Abhängigkeit hat, die mit Java 9-Bytecode nicht funktioniert. Es sieht so aus, als ob Jersey 1.x nicht für Java 9 übernommen wurde und es ist unklar, ob diese Unterstützung überhaupt verfügbar ist. Als vorübergehende Lösung habe ich einen branch erstellt, in dem ich shaded asm gelöscht, Pakete in Code migriert, um eine reguläre asm-Abhängigkeit zu verwenden, und asm 6.0 in maven-Abhängigkeiten abgelegt habe.

Sie können nur Jersey-Server- und Jersey-Servlet-Module aus diesem Zweig erstellen, da nur diese beiden von asm abhängen und diese beiden benutzerdefinierten Artefakte in Ihrem Projekt verwenden.

Meine Projekte funktionieren mit einem solchen Ersatz problemlos, aber ich kann nicht garantieren, dass die Lösung zu 100% funktioniert. Ich konnte die gesamte Distribution nicht fehlerfrei erstellen und kann jetzt keine Zeit für eine vollständige Übernahme und Überprüfung investieren. Zur gleichen Zeit wurden die wichtigsten Jersey-Teile ohne Probleme gebaut.

Ihr letzter Pom würde also so aussehen:

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

Es gibt einige Artefakte, die Sie möglicherweise aktualisieren müssen. Zunächst müssen Sie den mvn dependency:tree Ihres Moduls überprüfen, um nach einer Quelle für asm Ausschau zu halten, die die Version < 6.0.x enthält, da diese nicht mit Java9 kompatibel ist. Aus dem aktuellen pom.xml und wie aus Ihren Ausführungsprotokollen abgeleitet, können Sie Aktualisierungen vornehmen

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

zu

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

Verwenden Sie vor allem Java 9-kompatible Maven-Plugins wie -

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

Nebenbei bemerkt, könnten Sie noch vor einigen anderen Herausforderungen stehen (ich sehe widersprüchliche jaxb Abhängigkeiten, sogar asm kann von jersey transitiv sein), um zu entscheiden, welche Sie ausführen wollen

mvn dependency:analyze

und stellen Sie sicher, dass in solchen Fällen widersprüchliche Abhängigkeiten ausgeschlossen sind, um die aktualisierte Version zu verwenden.

1
nullpointer

Ich bekam diesen Fehler und in meinem Fall hatte er nichts mit der Version von Jersey zu tun. Es lag an einigen Elastic-Search-Gläsern (Elastic-Search, Elastic-Search-Core und log4j.2.1.1), die Multi-Release-Gläser waren. Gläser mit mehreren Veröffentlichungen haben einen Ordner namens version, der einige Artefakte in META-INF enthält. Ich habe diesen Ordner gelöscht und das Problem behoben.

Java #Jersey #Rest #elasticsearch

0
Mikematic