微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

JAXB API从Java 8到Java 11的迁移问题

如何解决JAXB API从Java 8到Java 11的迁移问题

我们正在将我们的项目从Java 8迁移到Java11。其中一个API依赖于利用JAXB的库。我们知道JAXB已从JAVA 11中删除,我们开始将JAXB依赖项包括在库的POM中。

 <!-- https://mvnrepository.com/artifact/jakarta.xml.bind/jakarta.xml.bind-api -->
  <!-- API -->
  <dependency>
    <groupId>jakarta.xml.bind</groupId>
    <artifactId>jakarta.xml.bind-api</artifactId>
    <version>2.3.3</version>
  </dependency>
  <!-- Runtime -->
  <dependency>
    <groupId>org.glassfish.jaxb</groupId>
    <artifactId>jaxb-runtime</artifactId>
    <version>2.3.2</version>
  </dependency>

使用以下命令运行API项目时,一切正常

mvn spring-boot:run

但是,当API部署在质量检查服务器中并使用带有-的启动脚本启动时,

java -jar Sample-api-3.0.0-SNAPSHOT.jar

调用依赖于JAXB的库时,API引发以下错误-

Caused by: javax.xml.bind.JAXBException: Implementation of JAXB-API has not been found on module path or classpath.
 [java.lang.classNotFoundException: com.sun.xml.bind.v2.ContextFactory]
      at javax.xml.bind.ContextFinder.newInstance(ContextFinder.java:269)
      at javax.xml.bind.ContextFinder.find(ContextFinder.java:412)
      at javax.xml.bind.JAXBContext.newInstance(JAXBContext.java:721)
      at javax.xml.bind.JAXBContext.newInstance(JAXBContext.java:662)
      at com.eoriginal.ecore.client.documents.SearchDocumentHistoryAPI$RequestParameters.toMap(SearchDocumentHistoryAPI.java:344)
      ... 14 more
    Caused by: java.lang.classNotFoundException: com.sun.xml.bind.v2.ContextFactory
      at java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:581)
      at java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders.java:178)
      at java.base/java.lang.classLoader.loadClass(ClassLoader.java:522)
      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:267)

更新: 我添加了Maven Shade插件生成具有所有依赖项的JAR,但是当执行代码行以创建JAXBContext时,错误仍然存​​在- JAXBContext jaxbc = JAXBContext.newInstance(new Class [] {Abc.class});

enter image description here

解决方法

JAXB需要javax.activation模块,该模块在更名为JakartaEE之后变成了RDKit molecule PNG。包括这种依赖关系应该会有所帮助:

<dependency>
    <groupId>jakarta.activation</groupId>
    <artifactId>jakarta.activation-api</artifactId>
    <version>2.0.0</version>
</dependency>

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。