我有一些使用JAXB API类的代码,这些类已作为Java 6/7/8中的JDK的一部分提供。当我用Java 9运行相同的代码时,在运行时得到错误,指示找不到JAXB类。
从Java 6开始,JAXB类就作为JDK的一部分提供了,那么为什么Java 9再也找不到这些类了呢?
我有一些使用JAXB API类的代码,这些类已作为Java 6/7/8中的JDK的一部分提供。当我用Java 9运行相同的代码时,在运行时得到错误,指示找不到JAXB类。
从Java 6开始,JAXB类就作为JDK的一部分提供了,那么为什么Java 9再也找不到这些类了呢?
当前回答
如果你使用的是JDK 11,你可以将以下内容添加到你的Gradle(应用程序):
dependencies {
...
annotationProcessor "javax.xml.bind:jaxb-api:2.3.1"
...
}
这对我很管用。
其他回答
我还碰到了ClassNotFoundException:javax.xml.bind。DatatypeConverter使用Java 11和
<dependency>
<groupId>io.jsonwebtoken</groupId>
<artifactId>jjwt</artifactId>
<version>0.9.1</version>
</dependency>
我尝试了添加javax.xml的所有方法。绑定:jaxb-api或spring boot jakarta.xml。bind-api . .我发现了一个关于jjwt 0.10.0版本修复的提示。但最重要的是,JJWT包现在是分开的!
因此,查看这个参考:https://github.com/jwtk/jjwt/issues/510
很简单,如果你使用
Java11和 jjwt 0.9。x和 你将面临ClassNotFoundException:javax.xml.bind。DatatypeConverter问题,
去
JJWT 0.11版。X,但是使用分离的包:https://github.com/jwtk/jjwt#install
你的maven找不到更高版本的jjwt依赖,因为他们把包分开了。
欢呼。
2019年4月更新
JAXB版本的Changelong在https://javaee.github.io/jaxb-v2/doc/user-guide/ch02.html
摘录:
4.1. Changes between 2.3.0.1 and 2.4.0
JAXB RI is now JPMS modularized:
All modules have native module descriptor.
Removed jaxb-core module, which caused split package issue on JPMS.
RI binary bundle now has single jar per dependency instead of shaded fat jars.
Removed runtime class weaving optimization.
4.2. Changes between 2.3.0 and 2.3.0.1
Removed legacy technology dependencies:
com.sun.xml.bind:jaxb1-impl
net.java.dev.msv:msv-core
net.java.dev.msv:xsdlib
com.sun.xml.bind.jaxb:isorelax
4.3. Changes between 2.2.11 and 2.3.0
Adopt Java SE 9:
JAXB api can now be loaded as a module.
JAXB RI is able to run on Java SE 9 from the classpath.
Addes support for java.util.ServiceLoader mechanism.
Security fixes
权威链接在https://github.com/eclipse-ee4j/jaxb-ri#maven-artifacts
Maven coordinates for JAXB artifacts jakarta.xml.bind:jakarta.xml.bind-api: API classes for JAXB. Required to compile against JAXB. org.glassfish.jaxb:jaxb-runtime: Implementation of JAXB, runtime used for serialization and deserialization java objects to/from xml. JAXB fat-jar bundles: com.sun.xml.bind:jaxb-impl: JAXB runtime fat jar. In contrast to org.glassfish.jaxb artifacts, these jars have all dependency classes included inside. These artifacts does not contain JPMS module descriptors. In Maven projects org.glassfish.jaxb artifacts are supposed to be used instead.
jaxb:jaxb-runtime:jar:2.3.2
[INFO] +- org.glassfish.jaxb:jaxb-runtime:jar:2.3.2:compile
[INFO] | +- jakarta.xml.bind:jakarta.xml.bind-api:jar:2.3.2:compile
[INFO] | +- org.glassfish.jaxb:txw2:jar:2.3.2:compile
[INFO] | +- com.sun.istack:istack-commons-runtime:jar:3.0.8:compile
[INFO] | +- org.jvnet.staxex:stax-ex:jar:1.8.1:compile
[INFO] | +- com.sun.xml.fastinfoset:FastInfoset:jar:1.2.16:compile
[INFO] | \- jakarta.activation:jakarta.activation-api:jar:1.2.1:compile
原来的答案
我应该在Maven项目中为JAXB RI使用哪些构件?在Maven中,你可以使用这样的配置文件:
<profile>
<id>java-9</id>
<activation>
<jdk>9</jdk>
</activation>
<dependencies>
<dependency>
<groupId>org.glassfish.jaxb</groupId>
<artifactId>jaxb-runtime</artifactId>
<version>2.3.0</version>
</dependency>
<dependency>
<groupId>javax.activation</groupId>
<artifactId>activation</artifactId>
<version>1.1.1</version>
</dependency>
</dependencies>
</profile>
依赖树显示:
[INFO] +- org.glassfish.jaxb:jaxb-runtime:jar:2.3.0:compile
[INFO] | +- org.glassfish.jaxb:jaxb-core:jar:2.3.0:compile
[INFO] | | +- javax.xml.bind:jaxb-api:jar:2.3.0:compile
[INFO] | | +- org.glassfish.jaxb:txw2:jar:2.3.0:compile
[INFO] | | \- com.sun.istack:istack-commons-runtime:jar:3.0.5:compile
[INFO] | +- org.jvnet.staxex:stax-ex:jar:1.7.8:compile
[INFO] | \- com.sun.xml.fastinfoset:FastInfoset:jar:1.2.13:compile
[INFO] \- javax.activation:activation:jar:1.1.1:compile
要在Eclipse中使用它,请输入Oxygen.3a Release (4.7.3a)或更高版本,按Ctrl-Alt-P,或右键单击项目Maven,然后选择概要文件。
对我来说,在Java 11和gradle这是什么工作:
plugins {
id 'java'
}
dependencies {
runtimeOnly 'javax.xml.bind:jaxb-api:2.3.1'
}
这是因为如果您使用的是JDK 9或更高版本,只需将此添加到您的pom
<dependency>
<groupId>javax.xml.bind</groupId>
<artifactId>jaxb-api</artifactId>
<version>2.3.0</version>
</dependency>
我知道我迟到了,但我的错误最终需要一个不同的解决方案……也非常简单
我最初部署到Tomcat 9,然后意识到我需要7…我忘记将我的类路径映射回build.xml中的7版本
希望这将在将来修复其他人的错误,谁设法忽略这个简单的问题,就像我一样!