ftp4j maven 版本 找不到_如何在Java 9以上版本中解决找不到类JAXBException

如何在Java 9中解决java.lang.NoClassDefFoundError:javax/xml/bind/JAXBException

升级到新的JDK 你会突然发现原来可以运行的项目突然不能启动了, 报形如

Caused by: java.lang.ClassNotFoundException: javax.xml.bind.PropertyException

的类找不到的错。

JAXB API被认为是Java EE API,因此不再包含在Java SE 9中的默认类路径中。在Java 11中,它们完全从JDK中删除。

Java 9引入了模块的概念,默认情况下,java.se聚合模块在类路径(或更确切地说,模块路径)上可用。正如其名称所暗示的,java.se汇聚模块并没有包括那些与Java 6/7/8传统上捆绑了Java EE的API。

幸运的是,JDK 6/7/8中提供的这些Java EE API仍然在JDK中,但它们默认情况下不在类路径上。以下模块中提供了额外的Java EE API:

java.activation
java.corba
java.transaction
java.xml.bind  << This one contains the JAXB APIs
java.xml.ws
java.xml.ws.annotation

快速而肮脏的解决方案:(仅限JDK 9/10)
要在运行时使JAXB API可用,请指定以下命令行选项:

--add-modules java.xml.bind

但我仍然需要这个与Java 8一起工作!
如果您尝试--add-modules使用较旧的JDK进行指定,那么它将会爆炸,因为它是一个无法识别的选项。我建议两种选择之一:

您可以使用JDK_JAVA_OPTIONS环境变量设置任何仅Java 9+选项。Java 9+ 的启动程序会自动读取此环境变量java。
您可以添加-XX:+IgnoreUnrecognizedVMOptions以使JVM静默忽略无法识别的选项,而不是炸毁。但要小心!您使用的任何其他命令行参数将不再由JVM验证。此选项适用于Oracle / OpenJDK以及IBM JDK(从JDK 8sr4开始)
备用快速解决方案:(仅限JDK 9/10)
请注意,您可以通过指定--add-modules java.se.ee选项在运行时使所有上述Java EE模块可用。该java.se.ee模块是一个聚合模块,包括java.se.ee以上Java EE API模块。

适当的长期解决方案:(JDK 9及更高版本)

上面列出的Java EE API模块都已标记@Deprecated(forRemoval=true),因为它们计划在Java 11中删除。因此,该--add-module方法将不再适用于Java 11开箱即用。

您需要在Java 11和转发中执行的操作是在类路径或模块路径上包含您自己的Java EE API副本。例如,您可以将JAX-B API添加为maven依赖项,如下所示:

<dependency>
    <groupId>javax.xml.bind</groupId>
    <artifactId>jaxb-api</artifactId>
    <version>2.2.11</version>
</dependency>
<dependency>
    <groupId>com.sun.xml.bind</groupId>
    <artifactId>jaxb-core</artifactId>
    <version>2.2.11</version>
</dependency>
<dependency>
    <groupId>com.sun.xml.bind</groupId>
    <artifactId>jaxb-impl</artifactId>
    <version>2.2.11</version>
</dependency>
<dependency>
    <groupId>javax.activation</groupId>
    <artifactId>activation</artifactId>
    <version>1.1.1</version>
</dependency>

有关Java模块化的完整详细信息,请参阅JEP 261:模块系统

对于Gradle或Android Studio开发人员:(JDK 9及更高版本)

将以下依赖项添加到build.gradle文件中:

dependencies {
    // JAX-B dependencies for JDK 9+
    implementation "javax.xml.bind:jaxb-api:2.2.11"
    implementation "com.sun.xml.bind:jaxb-core:2.2.11"
    implementation "com.sun.xml.bind:jaxb-impl:2.2.11"
    implementation "javax.activation:activation:1.1.1"
}

方法找不到 NoSuchMethodError: javax.annotation.Resource.lookup()Ljava/lang/String;

解决办法

<dependency>
    <groupId>javax.annotation</groupId>
    <artifactId>javax.annotation-api</artifactId>
    <version>1.3.2</version>
</dependency>

如果大家喜欢这篇文章可以点一下关注

java提升专栏里面有更多的文章和资料想学的朋友关注哦!!!

java提升​zhuanlan.zhihu.com
78f626de65901e0b5965a701a820fb10.png
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值