【问题标题】:Correctly migrating from JDK-8 to JDK-11 for JAX-WS libraries为 JAX-WS 库正确地从 JDK-8 迁移到 JDK-11
【发布时间】:2021-09-24 10:15:21
【问题描述】:

我正在几个缺陷管理系统之间开发几个集成(作为 Maven 项目),其中一个通过 WSDL 公开服务,迫使我通过 WS 使用它们。 对于后者,我成功开发了 JDK-8 的代码并且一切正常。

我现在正处于 JDK 从 8 到 11 的迁移过程中,需要更新使用 WS 的集成。我了解到在 Java 11 中删除了一些 EE 库(包括 JAX-WS)。 然后我上网以解决这个问题,但是经过几天的测试和依赖关系的剪切和粘贴后,我仍然遇到同样的问题:无法实例化 WS 以与最终服务器交互(即CA SDM 14.1)。

目前我有以下错误:

java.lang.NoSuchMethodException: com.sun.xml.bind.v2.model.nav.ReflectionNavigator.getInstance()

我的 POM 文件如下所示:

<properties>
    <target.dir>target</target.dir>
    <app.version>4.0.0</app.version>
    <skipTests>true</skipTests>
    <encoding>UTF-8</encoding>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
    <project.resources.sourceEncoding>UTF-8</project.resources.sourceEncoding>
    <mainClassName>unipol.alm.integrations.FireStarter</mainClassName>
    <java.version>11</java.version>
    <logback.version>1.2.3</logback.version>
    <lombok.version>1.18.20</lombok.version>
    <json.version>20210307</json.version>
    <apache.http.components.version>4.5.9</apache.http.components.version>
    <derby.version>10.14.2.0</derby.version>
    <junit.version>4.12</junit.version>
    <cucumber.version>1.2.5</cucumber.version>
    <octane.cucumber.version>12.60.48</octane.cucumber.version>
    <commons.version>2.5</commons.version>
    <json.simple.version>1.1.1</json.simple.version>
</properties>
<dependencies>
    <!-- Logging dependencies -->
    <dependency>
        <groupId>ch.qos.logback</groupId>
        <artifactId>logback-classic</artifactId>
        <version>${logback.version}</version>
    </dependency>
    <dependency>
        <groupId>javax.mail</groupId>
        <artifactId>mail</artifactId>
        <version>1.4.7</version>
    </dependency>
    <dependency>
        <groupId>org.projectlombok</groupId>
        <artifactId>lombok</artifactId>
        <version>${lombok.version}</version>
    </dependency>
    <dependency>
        <groupId>org.json</groupId>
        <artifactId>json</artifactId>
        <version>${json.version}</version>
    </dependency>
    <dependency>
        <groupId>com.googlecode.json-simple</groupId>
        <artifactId>json-simple</artifactId>
        <version>${json.simple.version}</version>
    </dependency>
    <dependency>
        <groupId>com.google.code.gson</groupId>
        <artifactId>gson</artifactId>
        <version>2.8.8</version>
    </dependency>
    <dependency>
        <groupId>com.sun.jersey</groupId>
        <artifactId>jersey-json</artifactId>
        <version>1.19.4</version>
    </dependency>
    <dependency>
        <groupId>com.sun.jersey</groupId>
        <artifactId>jersey-client</artifactId>
        <version>1.19.4</version>
    </dependency>
    <dependency>
        <groupId>com.google.guava</groupId>
        <artifactId>guava</artifactId>
        <version>30.1.1-jre</version>
    </dependency>
    <dependency>
        <groupId>org.codehaus.jettison</groupId>
        <artifactId>jettison</artifactId>
        <version>1.4.1</version>
    </dependency>
    <dependency>
        <groupId>org.jsoup</groupId>
        <artifactId>jsoup</artifactId>
        <version>1.14.2</version>
    </dependency>
    <dependency>
        <groupId>commons-codec</groupId>
        <artifactId>commons-codec</artifactId>
        <version>1.15</version>
    </dependency>
    <dependency>
        <groupId>org.apache.httpcomponents</groupId>
        <artifactId>httpclient</artifactId>
        <version>${apache.http.components.version}</version>
    </dependency>
    <dependency>
        <groupId>org.apache.httpcomponents</groupId>
        <artifactId>httpmime</artifactId>
        <version>${apache.http.components.version}</version>
    </dependency>
    <dependency>
        <groupId>org.apache.derby</groupId>
        <artifactId>derby</artifactId>
        <version>${derby.version}</version>
    </dependency>
    <dependency>
        <groupId>org.apache.derby</groupId>
        <artifactId>derbyclient</artifactId>
        <version>${derby.version}</version>
    </dependency>
    <dependency>
        <groupId>javax.xml.rpc</groupId>
        <artifactId>javax.xml.rpc-api</artifactId>
        <version>1.1.2</version>
    </dependency>
    <dependency>
        <groupId>com.hpe.alm.octane</groupId>
        <artifactId>octane-cucumber-jvm</artifactId>
        <version>${octane.cucumber.version}</version>
    </dependency>
    <dependency>
        <groupId>info.cukes</groupId>
        <artifactId>cucumber-junit</artifactId>
        <version>${cucumber.version}</version>
        <scope>test</scope>
    </dependency>
    <dependency>
        <groupId>junit</groupId>
        <artifactId>junit</artifactId>
        <version>${junit.version}</version>
        <scope>test</scope>
    </dependency>
    <dependency>
        <groupId>info.cukes</groupId>
        <artifactId>cucumber-java</artifactId>
        <version>${cucumber.version}</version>
        <scope>test</scope>
    </dependency>
    <dependency>
        <groupId>commons-io</groupId>
        <artifactId>commons-io</artifactId>
        <version>${commons.version}</version>
    </dependency>
    <dependency>
        <groupId>org.apache.axis</groupId>
        <artifactId>axis</artifactId>
        <version>1.4</version>
    </dependency>
    <dependency>
        <groupId>commons-discovery</groupId>
        <artifactId>commons-discovery</artifactId>
        <version>0.4</version>
    </dependency>
    <dependency>
        <groupId>javax.activation</groupId>
        <artifactId>activation</artifactId>
        <version>1.1.1</version>
    </dependency>
    <dependency>
        <groupId>javax.mail</groupId>
        <artifactId>javax.mail-api</artifactId>
        <version>1.6.2</version>
    </dependency>
    <dependency>
        <groupId>wsdl4j</groupId>
        <artifactId>wsdl4j</artifactId>
        <version>1.6.3</version>
    </dependency>
    <dependency>
        <groupId>net.lingala.zip4j</groupId>
        <artifactId>zip4j</artifactId>
        <version>2.3.0</version>
    </dependency>
    <dependency>
        <groupId>com.hierynomus</groupId>
        <artifactId>smbj</artifactId>
        <version>0.10.0</version>
    </dependency>
    <dependency>
        <groupId>commons-vfs</groupId>
        <artifactId>commons-vfs</artifactId>
        <version>1.0</version>
    </dependency>
    <dependency>
        <groupId>jcifs</groupId>
        <artifactId>jcifs</artifactId>
        <version>1.3.17</version>
    </dependency>
    <dependency>
        <groupId>javax.xml.ws</groupId>
        <artifactId>jaxws-api</artifactId>
        <version>2.3.1</version>
    </dependency>
    <dependency>
        <groupId>javax.jws</groupId>
        <artifactId>jsr181-api</artifactId>
        <version>1.0-MR1</version>
    </dependency>
    <dependency>
        <groupId>com.sun.xml.ws</groupId>
        <artifactId>rt</artifactId>
        <version>2.2.10</version>
    </dependency>
    <dependency>
        <groupId>com.sun.org.apache.xml.internal</groupId>
        <artifactId>resolver</artifactId>
        <version>20050927</version>
    </dependency>
    <dependency>
        <groupId>com.sun.xml.stream.buffer</groupId>
        <artifactId>streambuffer</artifactId>
        <version>1.5.6</version>
    </dependency>
    <dependency>
        <groupId>com.sun.xml.ws</groupId>
        <artifactId>policy</artifactId>
        <version>2.3.1</version>
    </dependency>
    <dependency>
        <groupId>com.sun.xml.messaging.saaj</groupId>
        <artifactId>saaj-impl</artifactId>
        <version>1.5.1</version>
    </dependency>
    <dependency>
        <groupId>com.sun.xml.bind</groupId>
        <artifactId>jaxb-core</artifactId>
        <version>3.0.2</version>
        <exclusions>
            <exclusion>
                <groupId>com.sun.xml.bind</groupId>
                <artifactId>jaxb-impl</artifactId>
            </exclusion>
        </exclusions>
    </dependency>
    <dependency>
        <groupId>com.sun.xml.bind</groupId>
        <artifactId>jaxb-impl</artifactId>
        <version>2.3.1</version>
    </dependency>
</dependencies>

javax.xml.ws 中的所有依赖项都是为使 JAX-WS 在 JDK 11 上工作而添加的(在代码通过 NoClassDefFoundError 给出的连续异常之后添加)。

此外,我从缺陷管理系统公开的 WSDL 生成 Java 类,并在我的 POM 中使用以下内容(只是第一次):

<plugin>
    <groupId>org.codehaus.mojo</groupId>
    <artifactId>jaxws-maven-plugin</artifactId>
    <version>2.6</version>
    <executions>
        <execution>
            <goals>
                <goal>
                    wsimport
                </goal>
            </goals>
        </execution>
    </executions>
    <configuration>
        <wsdlDirectory>${project.basedir}/src/main/resources/</wsdlDirectory>
        <wsdlUrls>
            <wsdlUrl>http://defect.management.system/ServiceDefinition?wsdl</wsdlUrl>
        </wsdlUrls>
        <packageName>com.ca.unicenterserviceplus.servicedesk</packageName>
        <sourceDestDir>${project.build.directory}/generated-sources/</sourceDestDir>
    </configuration>
</plugin>

然后将生成的文件复制并粘贴到com.ca.unicenterserviceplus.servicedesk 中,应用程序可以在其中找到它们。

我的问题毕竟是:有没有办法让事情像 JDK 8 一样工作?

【问题讨论】:

    标签: java maven web-services jax-ws java-11


    【解决方案1】:

    Oracle release notes for Java 11,我发现了这个:

    other-libs ➜ JEP 320 移除 Java EE 和 CORBA 模块

    从 Java SE 平台和 JDK。这些模块在 Java SE 9 中已被弃用,并声明了 打算在未来的版本中删除它们 (JEP 320)。

    以下模块已从 Java SE 11 和 JDK 11 中删除:

    java.xml.ws (JAX-WS, plus the related technologies SAAJ and Web Services Metadata)
    java.xml.bind (JAXB) 
    

    ...等

    根据我从 Oracle 读到的内容,他们从 Java 11 中删除了 Jax-WS,但它仍然可以在 OpenJDK 下使用:JEP 320: Remove the Java EE and CORBA Modules。根据该页面,

    本提案假设希望编译或运行的开发人员 最新 JDK 上的应用程序可以找到并部署替代版本 Java EE 技术。 参考实现 (RI) JAX-WS 和 JAXB 是一个很好的起点,因为它们是完整的 JDK 9 中 java.xml.ws 和 java.xml.bind 模块的替代品。 RI 可用作 Maven 工件:(请注意,它们必须是 部署在类路径上)

    com.sun.xml.ws : jaxws-ri (JAX-WS, plus SAAJ and Web Services Metadata)
    com.sun.xml.bind : jaxb-ri (JAXB)
    

    用于 JAX-WS 和 JAXB 的工具也可作为 Maven 工件使用:

    wsgen and wsimport: com.sun.xml.ws : jaxws-tools, plus tool scripts
    schemagen and xjc: com.sun.xml.bind : jaxb-jxc and com.sun.xml.bind : jaxb-xjc, plus tool scripts
    

    由于您使用的是 Java 8,您可能仍需要进行更多调整和/或首先迁移到 Java 9,但据我所知,这是您前进的唯一途径。

    总而言之,Oracle 从 Java 11 中删除了 Jax-WS 和相关技术,但它们仍然可供下载和使用,这里是指向 (RIs) of JAX-WS and JAXB 的 Maven 存储库的链接。 詹姆斯

    【讨论】:

    • 谢谢詹姆斯!很抱歉回复晚了:我们设法与管理 SOA 端点的团队进行了交谈,在不久的将来,他们将协助我们在此工具公开的 REST 接口上进行迁移。您的答案清晰完整,因此我将其标记为该主题的正确答案!
    • 迁移可能很困难且具有挑战性,我很高兴能够提供一些帮助。
    猜你喜欢
    • 2019-05-12
    • 1970-01-01
    • 2011-03-05
    • 2019-05-30
    • 2019-03-29
    • 1970-01-01
    • 1970-01-01
    • 2016-05-26
    • 1970-01-01
    相关资源
    最近更新 更多