资讯专栏INFORMATION COLUMN

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

ckllj / 3090人阅读

摘要:如何在中解决升级到新的你会突然发现原来可以运行的项目突然不能启动了,报形如的类找不到的错。被认为是,因此不再包含在中的默认类路径中。在中,它们完全从中删除。幸运的是,中提供的这些仍然在中,但它们默认情况下不在类路径上。

如何在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依赖项,如下所示:


    javax.xml.bind
    jaxb-api
    2.2.11


    com.sun.xml.bind
    jaxb-core
    2.2.11


    com.sun.xml.bind
    jaxb-impl
    2.2.11


    javax.activation
    activation
    1.1.1

有关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;

解决办法

 
    javax.annotation
    javax.annotation-api
    1.3.2

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/76011.html

相关文章

  • XML转换

    摘要:将转换为字符串将字符串转换为指定类型的指定所有字符串获取节点值测试一中益阳 XmlUtils package com.daily.xmltest; import com.alibaba.fastjson.JSON; import org.apache.log4j.Logger; import org.springframework.util.CollectionUtils; impo...

    qpwoeiru96 评论0 收藏0
  • 崩溃bug日志总结2

    摘要:出现错误引发崩溃日志的流程分析这个错误是应用的方法总数限制造成的。 目录介绍 1.1 java.lang.ClassNotFoundException类找不到异常 1.2 java.util.concurrent.TimeoutException连接超时崩溃 1.3 java.lang.NumberFormatException格式转化错误 1.4 java.lang.Illegal...

    sutaking 评论0 收藏0
  • 实现一个spring webservice服务端四:服务端、客户端以及httpclient调用spr

    摘要:执行结果如下中华田园犬测试我认为所有使用协议的,都能使用测试。下面是我写的测试代码旺财需要增加一个包测试结果返回值如下中华田园犬写法稍微有点麻烦的是,需要拼接请求参数,参数少的话还好,多的话就很烦不过这种方法不用生成一大堆客户端代码。 经过前段时间的学习,已经实现一个有返回值的spring-ws服务,那接下来,就要试试能不能通过不同方式的调用,要实现一下几种方式的测试: spring...

    oneasp 评论0 收藏0
  • Android 使用fastjson不到fastjson包问题的解决方法

    摘要:但是将导入工程后,在使用时会出现等错误消息。初步认为是与自带的冲突。再运行工程,这个错误不再出现了,奇迹般的没问题了。我的理解是这样,不知道对不对,欢迎大侠指正。工程中下默认的是,而则应该是。所以按照该文的解决方法,更改就好了。 JSON解析库有很多,诸如Jackson,Json-lib,org.json,Gson和fastjson等,但是fastjson以其解析速度最快而脱颖而出。详...

    hiYoHoo 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<