当前位置: 首页 > 知识库问答 >
问题:

Java 11:在模块路径或类路径上未找到JAXB-API的实现

后树
2023-03-14

我有一个小项目,当我让它运行时,它确实会引发异常。

问题就在这里(TestObject.java):

final JAXBContext jaxbContext = JAXBContext.newInstance(...);

我真的不明白为什么这会引发异常。我还创建了一个类似于charm的测试(TestTest.java)。请原谅我的名字,但这只是一个小的测试应用程序,可以让它与java 11一起工作。

我遵循了这个:javax。xml。绑定在模块路径或类路径上未找到JAXB-API的JAXBException实现,已添加

compile('javax.xml.bind:jaxb-api:2.3.0')
compile('javax.activation:activation:1.1')
compile('org.glassfish.jaxb:jaxb-runtime:2.3.0')

我的身材。gradle但它抱怨说

Error:java: module not found: java.activation

缺少。由于这也已从Java 11中删除,我添加了:

compile 'com.sun.activation:javax.activation:1.2.0'

但这会带来很多错误:

Error:java: the unnamed module reads package com.sun.xml.bind from both jaxb.runtime and jaxb.core
Error:java: the unnamed module reads package com.sun.xml.bind.util from both jaxb.runtime and jaxb.core
Error:java: the unnamed module reads package com.sun.xml.bind.marshaller from both jaxb.runtime and jaxb.core
Error:java: the unnamed module reads package com.sun.xml.bind.api from both jaxb.runtime and jaxb.core
Error:java: the unnamed module reads package com.sun.xml.bind.v2 from both jaxb.runtime and jaxb.core
Error:java: the unnamed module reads package com.sun.xml.bind.v2.util from both jaxb.runtime and jaxb.core
Error:java: the unnamed module reads package com.sun.xml.bind.v2.model.impl from both jaxb.runtime and jaxb.core
Error:java: the unnamed module reads package com.sun.xml.bind.v2.model.annotation from both jaxb.runtime and jaxb.core
Error:java: the unnamed module reads package com.sun.xml.bind.v2.runtime from both jaxb.runtime and jaxb.core
Error:java: the unnamed module reads package com.sun.xml.bind.v2.runtime.unmarshaller from both jaxb.runtime and jaxb.core
Error:java: the unnamed module reads package com.sun.xml.bind.unmarshaller from both jaxb.runtime and jaxb.core
Error:java: module jaxb.runtime reads package com.sun.xml.bind from both jaxb.core and jaxb.runtime
Error:java: module jaxb.runtime reads package com.sun.xml.bind.util from both jaxb.core and jaxb.runtime
Error:java: module jaxb.runtime reads package com.sun.xml.bind.marshaller from both jaxb.core and jaxb.runtime
Error:java: module jaxb.runtime reads package com.sun.xml.bind.api from both jaxb.core and jaxb.runtime
Error:java: module jaxb.runtime reads package com.sun.xml.bind.v2 from both jaxb.core and jaxb.runtime
Error:java: module jaxb.runtime reads package com.sun.xml.bind.v2.util from both jaxb.core and jaxb.runtime
Error:java: module jaxb.runtime reads package com.sun.xml.bind.v2.model.impl from both jaxb.core and jaxb.runtime
Error:java: module jaxb.runtime reads package com.sun.xml.bind.v2.model.annotation from both jaxb.core and jaxb.runtime
Error:java: module jaxb.runtime reads package com.sun.xml.bind.v2.runtime from both jaxb.core and jaxb.runtime
Error:java: module jaxb.runtime reads package com.sun.xml.bind.v2.runtime.unmarshaller from both jaxb.core and jaxb.runtime
Error:java: module jaxb.runtime reads package com.sun.xml.bind.unmarshaller from both jaxb.core and jaxb.runtime
Error:java: module jaxb.core reads package com.sun.xml.bind from both jaxb.core and jaxb.runtime

让我如此困惑的是:测试有效。所以看起来在Junit5环境中有某种jaxb实现。我还发现了一些关于如何将java 8应用程序迁移到java 9模块的其他信息,我在其中发现了这个:

compile group: 'javax.xml.bind', name: 'jaxb-api', version: '2.4.0-b180830.0359'
compile group: 'org.glassfish.jaxb', name: 'jaxb-runtime', version: '2.4.0-b180830.0438'
compile group: 'org.glassfish.jaxb', name: 'jaxb-xjc', version: '2.4.0-b180830.0438'

但这也行不通。如果有人能帮我跑起来,我会很高兴的。我使用java-openjdk-11.0.1.13-11。滚动的。Fedora 29上的fc29.x86\U 64,64位。

附言:我想把这些都写进帖子的评论中,主题是“javax.xml.bind.JAXBException…”但我不被允许这样做。所以我创建了这个新帖子。

编辑:该示例应用程序中引发的异常如下:

Exception in thread "main" java.lang.RuntimeException: javax.xml.bind.JAXBException: Implementation of JAXB-API has not been found on module path or classpath.
 - with linked exception:
[java.lang.ClassNotFoundException: com.sun.xml.bind.v2.ContextFactory]
    at test/com.example.TestObject.doSomething(TestObject.java:21)
    at test/com.example.TestObject.main(TestObject.java:12)
Caused by: javax.xml.bind.JAXBException: Implementation of JAXB-API has not been found on module path or classpath.
 - with linked exception:
[java.lang.ClassNotFoundException: com.sun.xml.bind.v2.ContextFactory]
    at java.xml.bind/javax.xml.bind.ContextFinder.newInstance(ContextFinder.java:269)
    at java.xml.bind/javax.xml.bind.ContextFinder.find(ContextFinder.java:412)
    at java.xml.bind/javax.xml.bind.JAXBContext.newInstance(JAXBContext.java:721)
    at java.xml.bind/javax.xml.bind.JAXBContext.newInstance(JAXBContext.java:662)
    at test/com.example.TestObject.doSomething(TestObject.java:17)
    ... 1 more
Caused by: java.lang.ClassNotFoundException: com.sun.xml.bind.v2.ContextFactory
    at java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:583)
    at java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders.java:178)
    at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:521)
    at java.xml.bind/javax.xml.bind.ServiceLoaderUtil.nullSafeLoadClass(ServiceLoaderUtil.java:122)
    at java.xml.bind/javax.xml.bind.ServiceLoaderUtil.safeLoadClass(ServiceLoaderUtil.java:155)
    at java.xml.bind/javax.xml.bind.ContextFinder.newInstance(ContextFinder.java:267)
    ... 5 more

共有3个答案

梁泰
2023-03-14

我发现有一个ClassLoader错误,特别是如果您通过ForkJoinPool或类似的方式在线程中执行工作。错误列在这里:https://github.com/eclipse-ee4j/jaxb-api/issues/78

静态地创建JaxbContext将强制使用正确的类加载器,但这是有漏洞的/

祁英哲
2023-03-14

为了完成其他答案:

JAXB使用绑定到当前线程的类加载器来查找JAXB上下文工厂类(thread.currentThread()。getContextClassLoader(),在某些情况下(例如使用jetty线程),绑定的类加载器是一个平台类加载器,与AppClassLoader相反,它具有不知道类路径的特殊性。

要解决此问题,JAXB API和运行时必须位于模块路径中(可通过PlatformClassLoader访问)。

例如,应用程序打包有以下依赖项:

<dependency>
    <groupId>jakarta.xml.bind</groupId>
    <artifactId>jakarta.xml.bind-api</artifactId>
    <version>2.3.3</version>
</dependency>
<dependency>
    <groupId>org.glassfish.jaxb</groupId>
    <artifactId>jaxb-runtime</artifactId>
    <version>2.3.3</version>
</dependency>

因此,应用程序应该使用jaxb-runtime及其模块依赖项启动,如下所示:

### Set the module-path
MODULEPATH="./lib/jaxb-runtime-2.3.3.jar"
MODULEPATH="${MODULEPATH}:./lib/jakarta.activation-1.2.2.jar"
MODULEPATH="${MODULEPATH}:./lib/jakarta.xml.bind-api-2.3.3.jar"
MODULEPATH="${MODULEPATH}:./lib/txw2-2.3.3.jar"
MODULEPATH="${MODULEPATH}:./lib/istack-commons-runtime-3.0.11.jar"

java --module-path ${MODULEPATH} --add-modules ALL-MODULE-PATH [...]

注意:ALL-MODULE-PATH可以替换为特定的模块名称

田嘉澍
2023-03-14

解决方案非常简单。首先,使用jaxb 2.3.1。beta仅用于测试。真正的问题是module-info.java.jaxb需要有2个条目:

requires java.xml.bind;
requires com.sun.xml.bind;

第一个要求定义实现,第二个要求定义API。

唯一需要的两个依赖项是:

compile group: 'javax.xml.bind', name: 'jaxb-api', version: '2.3.1'
compile group: 'org.glassfish.jaxb', name: 'jaxb-runtime', version: '2.3.1'
 类似资料:
  • 我正试图在Java9上运行我的Spring Boot应用程序,但我遇到了JAXB问题,这在指南中有描述,但对我不起作用。我添加了对JAXB api的依赖,应用程序开始工作。如果由于缺少JAXB缺少使用Java version>=9的实现而出现以下异常:

  • 我试图在Java 9上运行我的Spring Boot应用程序,我遇到了JAXB问题,这在指南中有描述,但对我来说并不适用。我添加了对JAXB api的依赖,应用程序开始工作。如果由于缺少JAXB而导致以下异常缺少使用Java版本的实现

  • 我有一个基于官方指南的简单Spring项目来使用Web服务。此示例似乎针对JDK 8,但我想使用最新的LTS JDK 11。 我已经改编了pom。xml文件,并添加了一些似乎已从JDK中删除的依赖项,即: 但是,我似乎无法启动应用程序,我总是得到这个错误: 尽管至少有两个问题(这个和这个)与这个主题相关,但我已经尝试了在这些帖子中可以找到的所有版本组合,我仍然有相同的错误。 我使用的特定JDK m

  • 问题内容: 我不太确定是什么原因导致的,因为清单中正确列出了它: 我还添加了来构建路径,并将其移至的顶部,但是它仍然给我同样的错误。 编辑:我完全重建了该项目,并且无法重现该错误。不知道是什么原因造成的。 问题答案: 我的项目有同样的问题。这是由于我的项目与我在项目中添加的库项目之间的android支持库版本冲突而发生的。将相同版本的android支持库放入您的项目和包含的库项目中,并清理构建 …

  • 问题内容: 我目前正在一个项目中,我必须使用纯本地ndk。当我尝试从Irrlicht引擎源运行helloworld示例时,它起作用了。然后,按照该示例的相同格式尝试在我的项目中使用它。但是我得到了: 在运行我的项目时。 这是我的main.cpp文件: n Android.mk: 我在AndroidManifest.xml中给了Activity名称: 我在这里做什么错?如有必要,我将发布完整代码。

  • 我目前正在做一个项目,在这个项目中我必须使用纯原生的NDK。当我尝试从Irrlicht引擎源代码运行helloworld示例时,它起到了作用。然后我尝试在我的项目中使用它,遵循该示例的相同格式。但我得到: 在运行我的项目时。 并且我在AndroidManifest.xml中给出了活动名称: 我在这里犯了什么错误?如果需要,我会发布完整的代码。