【问题标题】:Java 8 to Java 11 migration issues with JAXB APIJAXB API 的 Java 8 到 Java 11 迁移问题
【发布时间】:2021-02-24 13:47:17
【问题描述】:

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

 <!-- 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 部署在 QA 服务器中并使用带有 -

的启动脚本启动时

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});

【问题讨论】:

标签: spring-boot maven java-8 jaxb java-11


【解决方案1】:

JAXB 需要 javax.activation 模块,在更名为 JakartaEE 后变为 jakarta.activation。包含这种依赖关系应该会有所帮助:

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

【讨论】:

  • 我仍然面临这个问题 - 原因:javax.xml.bind.JAXBException:在模块路径或类路径上找不到 JAXB-API 的实现。在我的 POM 中有以下依赖项 -
  • 我还看到,当我用 Java 构建库时,我看不到外部库中的任何依赖项。这可能是个问题,我必须手动捆绑 JAXB 库。
  • 对activation-api 版本1.2.1(不是2.0.0)的依赖已添加到jaxb-runtime:2.3.2。见mvnrepository.com/artifact/org.glassfish.jaxb/jaxb-runtime/…
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-06-09
  • 2020-03-01
  • 2019-09-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-14
相关资源
最近更新 更多