java - 如何替换 --add-modules java.xml.ws

标签 java maven jaxb java-9 java-module

我确实将基于 Maven 的项目迁移到了 SpringBoot 2.0 和 Java 9。在此过程中,我必须添加一些依赖项以消除有关模块的 Java 9 警告(仍然可以使用 --add-modules 添加)。

但是我无法摆脱--add-modules java.xml.ws。正如 JEP 320 中所建议的,添加依赖项:

<dependency>
    <groupId>javax.xml.bind</groupId>
    <artifactId>jaxb-api</artifactId>
    <version>2.3.0</version>
</dependency>
<dependency>
    <groupId>com.sun.xml.bind</groupId>
    <artifactId>jaxb-impl</artifactId>
    <version>2.3.0</version>
</dependency>
<dependency>
    <groupId>com.sun.xml.bind</groupId>
    <artifactId>jaxb-core</artifactId>
    <version>2.3.0</version>
</dependency>

这些依赖项允许运行mvn test来运行。 IntelliJ IDE 的构建也可以工作。

但是,当启动 Spring Boot 应用程序时,我收到以下运行时异常:

...
Caused by: java.lang.ClassNotFoundException: com.sun.xml.internal.bind.v2.ContextFactory
    at java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:582)
    at java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders.java:185)
    at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:496)
    at javax.xml.bind.ServiceLoaderUtil.nullSafeLoadClass(ServiceLoaderUtil.java:122)
    at javax.xml.bind.ServiceLoaderUtil.safeLoadClass(ServiceLoaderUtil.java:155)
    at javax.xml.bind.ContextFinder.newInstance(ContextFinder.java:174)
    ... 64 more

我缺少哪些 Maven 依赖项? JarFinder告诉我实现类是 jaxb-impl 的一部分,但仅限于版本 2.2.12。那么这个实现消失到哪里去了?

最佳答案

您还需要 jaxb-runtime:

    <dependency>                                                            
        <groupId>org.glassfish.jaxb</groupId>                               
        <artifactId>jaxb-runtime</artifactId>                               
        <version>2.3.0</version>                                            
    </dependency> 

我认为您不需要任何 com.sun 依赖项,请使用 glassfish 来实现:

    <dependency>
        <groupId>org.glassfish.jaxb</groupId>
        <artifactId>jaxb-runtime</artifactId>
        <version>2.3.0</version>
    </dependency>
    <dependency>
        <groupId>org.glassfish.jaxb</groupId>
        <artifactId>jaxb-core</artifactId>
        <version>2.3.0</version>
    </dependency>
    <dependency>
        <groupId>javax.xml.bind</groupId>
        <artifactId>jaxb-api</artifactId>
        <version>2.3.0</version>
    </dependency>

作为旁注,我认为至少有一个启动 spring 上下文的集成测试(maven 故障安全测试)是很好的。如果您有的话,请确保至少使用surefire 和failsafe 2.21.0(之前的版本存在--add-modules 的错误)。

关于java - 如何替换 --add-modules java.xml.ws,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49480092/

相关文章:

java - 应用程序与容器管理的 EntityManager

java - 无法在vim中更新jar中的文件

hibernate - 非法参数异常 : Not an entity - distributed model definitions in hibernate/jpa and Maven

java - 如何为xjc编写外部绑定(bind)文件?

java - Java 无限 while 循环计数标记

java - 从处理程序线程调用 FindViewById - NullPointerException

java - 如何从 Java 中的 while 循环返回 count 的值

java - Spring Boot EntityManagerFactory 未定义且不允许@ManyToOne

java - 使用 JAXB 从 XML 字符串创建对象

java - 如何将 JAXBElement 作为 SOAPBody 的子级附加到 SOAP 消息