将JAXWS应用程序从Java 8迁移到Java 11

31

我在寻找一个兼容的组合,将 org.apache.cxf:cxf-spring-boot-starter-jaxws 与 Java 10+ 上的 jaxws-api/jaxws-ri 相结合。

我们的应用在 Java 8 上可以正常工作。

同时,在 Java 9 和 10 上添加 --add-modules=java.se.ee 也可以。

但是,当我删除此选项并添加以下依赖项时:

compile group: 'javax.xml.ws', name: 'jaxws-api', version: '2.3.0'
compile group: 'com.sun.xml.ws', name: 'jaxws-ri', version: '2.3.0.2', ext: 'pom'
compile group: 'com.sun.xml.ws', name: 'jaxws-rt', version: '2.3.0.2', ext: 'pom'

常见依赖项(在Java 9/10中使用/不使用--add-modules或Java 8中):

compile('org.apache.cxf:cxf-spring-boot-starter-jaxws:3.2.6')
我成为:
Caused by: java.lang.NoSuchMethodError: javax.jws.WebMethod.exclude()Z
    at org.apache.cxf.jaxws.support.JaxWsServiceConfiguration.isOperation(JaxWsServiceConfiguration.java:190)
    at org.apache.cxf.wsdl.service.factory.ReflectionServiceFactoryBean.isValidMethod(ReflectionServiceFactoryBean.java:1962)
    at org.apache.cxf.wsdl.service.factory.ReflectionServiceFactoryBean.createInterface(ReflectionServiceFactoryBean.java:999)
    at org.apache.cxf.wsdl.service.factory.ReflectionServiceFactoryBean.buildServiceFromClass(ReflectionServiceFactoryBean.java:461)
    at org.apache.cxf.jaxws.support.JaxWsServiceFactoryBean.buildServiceFromClass(JaxWsServiceFactoryBean.java:695)
    at org.apache.cxf.wsdl.service.factory.ReflectionServiceFactoryBean.initializeServiceModel(ReflectionServiceFactoryBean.java:530)
    at org.apache.cxf.wsdl.service.factory.ReflectionServiceFactoryBean.create(ReflectionServiceFactoryBean.java:263)
    at org.apache.cxf.jaxws.support.JaxWsServiceFactoryBean.create(JaxWsServiceFactoryBean.java:199)
    at org.apache.cxf.frontend.AbstractWSDLBasedEndpointFactory.createEndpoint(AbstractWSDLBasedEndpointFactory.java:103)
    at org.apache.cxf.frontend.ServerFactoryBean.create(ServerFactoryBean.java:168)
    at org.apache.cxf.jaxws.JaxWsServerFactoryBean.create(JaxWsServerFactoryBean.java:211)
    at org.apache.cxf.jaxws.EndpointImpl.getServer(EndpointImpl.java:460)
    at org.apache.cxf.jaxws.EndpointImpl.doPublish(EndpointImpl.java:338)
    at org.apache.cxf.jaxws.EndpointImpl.publish(EndpointImpl.java:255)
    at .....
    at org.springframework.cglib.proxy.MethodProxy.invokeSuper(MethodProxy.java:228)
    at org.springframework.context.annotation.ConfigurationClassEnhancer$BeanMethodInterceptor.intercept(ConfigurationClassEnhancer.java:361)
    at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.base/java.lang.reflect.Method.invoke(Method.java:564)
    at org.springframework.beans.factory.support.SimpleInstantiationStrategy.instantiate(SimpleInstantiationStrategy.java:154)
    ... 44 more

以下是我总结的一些解决类似问题的调试要点... 1. com.sun.xml.ws:jaxws-ri:2.3.0.2 的一个传递依赖项 javax.jws:jsr181-api:jar:1.0-MR1 引入了接口 WebMethod,该接口确实具有方法 exclude... 2. 请确保没有其他依赖项引入了具有不同实现的相同接口? 3. 另外,请详细说明您正在如何构建/执行应用程序的问题。 - Naman
ad 3) @SpringBootTest - amjr
ad 2) 只需使用 spring-boot-starter-web 和 spring-boot-starter-test 2.0.3。这是一个小应用程序,具有少量的依赖项,并且不需要 JAXWS。如果应用程序更复杂,我还想开展关于迁移的一般讨论。 - amjr
只需使用https://github.com/codecentric/cxf-spring-boot-starter-它可以在不给开发人员带来任何麻烦的情况下集成Apache CXF和Spring Boot。它还解决了您升级到Java 11(和15 :))的问题。它还通过https://github.com/codecentric/cxf-spring-boot-starter-maven-plugin自动处理所有JAX-B类生成的功能,并且仅从您的`.wsdl`文件中生成每个Spring Boot类100%(实现契约优先概念)。但它也可以在仅客户端模式下工作。 - jonashackt
3个回答

30

我对Sprint Boot不确定,但是为了让JAXWS在Java 11中工作,我使用了

<profiles>
    <!-- add back the jaxws SOAP dependendies which were removed in JDK11 -->
    <profile>
        <id>jdk11</id>
        <activation>
            <jdk>[11,)</jdk>
        </activation>
        <!-- tested working with OpenJDK 11.0.8 -->
        <dependencies>
            <dependency>
                <groupId>com.sun.xml.ws</groupId>
                <artifactId>jaxws-rt</artifactId>
                <version>2.3.3</version>
                <type>pom</type>
            </dependency>
            <dependency>
                <groupId>com.sun.xml.ws</groupId>
                <artifactId>rt</artifactId>
                <version>2.3.3</version>
            </dependency>
        </dependencies>
    </profile>
</profiles>

如果您需要从wsdl生成客户端,请查看此问题https://dev59.com/AVQJ5IYBdhLWcg3w5aMc - JuanMoreno
3
jaxws-rt.jar使用了3个在Java 11.0.5中已被移除的JDK内部API。是否有其他可替代的库可用于此jar?是否有其他与Java 11兼容的jar包? - Rohit Gaikwad
对于wsdl生成,如果找到了一个可行的解决方案,结合Cassian的答案和这个。 - Paul

23
这个移除的相关文档(JEP 320)有一个名为风险和假设的主题,接着是Java EE模块,其中他们提出了移除的替代方案,如jaxws-rijaxb-ri
在我的情况下,我在Java 8中使用了javax.jws包,在Java 11中被移除。因此,正如JEP建议的那样,我只需要添加以下依赖项就可以在Java 11上重新运行它:
<dependency>
    <groupId>com.sun.xml.ws</groupId>
    <artifactId>jaxws-ri</artifactId>
    <version>2.3.2</version>
    <type>pom</type>
</dependency>

在您的情况下,您可能还需要其他依赖项,请查看JEP建议。


1
我有一个类似的问题,但我仍然找不到解决方案。你能否展示一下你的pom.xml文件中SOAP所需的完整依赖列表? - Max Lich
我们已经从特定的依赖项更改为jaxb2-maven-plugin 2.5.0+,其中包括该依赖项以及其他一些新的依赖项。请查看此答案https://dev59.com/HlQI5IYBdhLWcg3w-Qpi#56972713,并尝试使用最新版本的jaxb2-maven-plugin。 - Rafael Renan Pacheco

2
你可以使用雅加达代替:
<dependency>
    <groupId>jakarta.xml.ws</groupId>
    <artifactId>jakarta.xml.ws-api</artifactId>
    <version>4.0.0</version>
</dependency>

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接