Java 10:替换 java.xml.ws 冲突

Java 10: Replacement for java.xml.ws conflict

我必须在我的项目中使用 java.xml.ws* 组件,但因为它已被弃用并将很快被删除,我想使用这些组件的替代品。所以我将此依赖项添加到我项目的 pom 文件中:

<dependency>
    <groupId>com.sun.xml.ws</groupId>
    <artifactId>jaxws-ri</artifactId>
    <version>2.3.0</version>
    <type>pom</type>
</dependency>

这是我的模块配置:

module x.y.z {
    requires kotlin.stdlib;
    requires spring.boot;
    requires spring.boot.autoconfigure;
    requires spring.context;
    requires cxf.core;
    requires cxf.rt.frontend.jaxws;
    requires java.xml.ws;
}

但是出现错误:

这是什么意思以及如何修复它以便我可以使用上面的依赖项而不是 jdk 中的 java.xml.ws

通过添加 requires java.xml.ws,您告诉模块系统您依赖于已弃用的 Java EE 模块 java.xml.ws,然后它将解决并提供。同时模块路径上似乎有一个同名模块。 (也许是 jaxws-ri 引入的 JAR?)

虽然,仔细想想,我本以为会有编译器消息抱怨重复模块...看起来错误(是编译器还是 运行time?)来自 IDE。如果您 运行 使用 Maven 构建会怎样?

总之,如果你愿意从Java11开始,你可以试试看。 Java EE 模块已删除,因此平台模块不会受到干扰。不过,我不确定是否可以在模块路径上添加 java.* 模块。

如果不是或者你更喜欢坚持 Java 10,你应该看看 upgreadable modules and the --upgrade-module-path option。这样您就可以使用提供 JAX WS API 的 JAR 来替换平台模块。

就用Java11 :) 那里没有javax.xml.ws模块,所以没有冲突。

至于 Java 10,最简单的解决方法是将 jaxws-ri 的范围更改为 runtime:

<dependency>
    <groupId>com.sun.xml.ws</groupId>
    <artifactId>jaxws-ri</artifactId>
    <version>2.3.0</version>
    <scope>runtime</scope>
</dependency>