![](/img/trans.png)
[英]Java Implementation of JAXB-API has not been found on module path or classpath
[英]Java 11: Implementation of JAXB-API has not been found on module path or classpath
我有一个小项目,当我让它运行时确实会抛出异常。
问题就在这里(TestObject.java):
final JAXBContext jaxbContext = JAXBContext.newInstance(...);
我真的不明白为什么会抛出异常。 我还创建了一个非常有效的测试 (TestTest.java)。 请原谅我的名字,但这只是一个小的测试应用程序,可以使它与 java 11 一起工作。
我遵循了这个: javax.xml.bind.JAXBException JAXB-API Implementation has not been found on module path or classpath and added
compile('javax.xml.bind:jaxb-api:2.3.0')
compile('javax.activation:activation:1.1')
compile('org.glassfish.jaxb:jaxb-runtime:2.3.0')
到我的 build.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'
但这也行不通。 如果有人可以帮助我运行它,我将非常高兴。 我在 64 位 Fedora 29 上使用 java-openjdk-11.0.1.13-11.rolling.fc29.x86_64。
ps:我想将所有这些写到主题为“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
解决方案非常简单。 首先,使用 jaxb 2.3.1。 测试版仅用于测试。 真正的问题是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'
为了完成其他答案:
JAXB 使用绑定到当前线程的类加载器来查找 JAXB ContextFactory
类( Thread.currentThread().getContextClassLoader()
),并且在某些情况下(例如使用 jetty 线程),绑定的类加载器是一个PlatformClassLoader
,它具有特殊性不知道 class-path ,与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 可以替换为特定的模块名称
我相信java.lang.ClassNotFoundException
即将到来,因为多个版本无法定义定义。
解决方案:从本地m2存储库中删除com.sun.xml
文件夹,只下载一个依赖项。
javax.xml.bind:jaxb-api:pom/gradle 中的“最新版本”。
我发现有一个 ClassLoader 错误,尤其是当您通过 ForkJoinPool 或类似方法在线程内工作时。 该错误在此处列出: https : //github.com/eclipse-ee4j/jaxb-api/issues/78
静态创建 JaxbContext 将强制使用正确的 ClassLoader,但它很笨拙。 :/
从我的外部库中删除了 maven-dependency com.sun.xml.bind
,它不是模块化的,很多错误,比如the unnamed module reads package com.sun.xml.bind.util
已经消失了。
我正在使用Moxy
,即使添加了jaxb.properties
文件,我也收到了这个错误。 所以我必须确保以下几点:
以下是dependency
:
<dependency>
<groupId>jakarta.xml.bind</groupId>
<artifactId>jakarta.xml.bind-api</artifactId>
<version>3.0.1</version>
</dependency>
<dependency>
<groupId>org.eclipse.persistence</groupId>
<artifactId>eclipselink</artifactId>
<version>3.0.0</version>
</dependency>
除了依赖之外,确保Moxy
在compilatation
期间使用同一个包中存在的jaxb.properties
文件很重要。 因此,在pom.xml
的dependencies
上方添加以下内容:
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<source>8</source>
<target>8</target>
</configuration>
</plugin>
</plugins>
<resources>
<resource>
<directory>src/main/java</directory>
<excludes>
<exclude>**/*.java</exclude>
</excludes>
</resource>
</resources>
</build>
一切都将是这样的:
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<source>8</source>
<target>8</target>
</configuration>
</plugin>
</plugins>
<resources>
<resource>
<directory>src/main/java</directory>
<excludes>
<exclude>**/*.java</exclude>
</excludes>
</resource>
</resources>
</build>
<dependencies>
<dependency>
<groupId>jakarta.xml.bind</groupId>
<artifactId>jakarta.xml.bind-api</artifactId>
<version>3.0.1</version>
</dependency>
<dependency>
<groupId>org.eclipse.persistence</groupId>
<artifactId>eclipselink</artifactId>
<version>3.0.0</version>
</dependency>
</dependencies>
升级到 SpringBoot 2.5 时,我收到了同样的异常。 添加以下依赖项(Maven)解决了我的问题:
<dependency>
<groupId>org.glassfish.jaxb</groupId>
<artifactId>jaxb-runtime</artifactId>
</dependency>
用于使用 Spring 2.5.3 实现 OAuth2,以及 OAuth2 的依赖项
<dependency>
<groupId>org.springframework.security.oauth</groupId>
<artifactId>spring-security-oauth2</artifactId>
<version>2.5.1.RELEASE</version>
</dependency>
使用以下依赖项将消除Caused by: java.lang.ClassNotFoundException: com.sun.xml.internal.bind.v2.ContextFactory at java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:822) ~[na:na] at java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders.java:182) ~[na:na]
以下原因Caused by: java.lang.ClassNotFoundException: com.sun.xml.internal.bind.v2.ContextFactory at java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:822) ~[na:na] at java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders.java:182) ~[na:na]
的错误Caused by: java.lang.ClassNotFoundException: com.sun.xml.internal.bind.v2.ContextFactory at java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:822) ~[na:na] at java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders.java:182) ~[na:na]
<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>
对于 Java 11 - Gradle 我遇到了同样的问题,下面的依赖项解决了它
compileOnly 'javax.xml.bind:jaxb-api:2.3.1'
compileOnly 'org.glassfish.jaxb:jaxb-runtime:2.3.1' code here
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.