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

简介: 升级到新的JDK 你会突然发现原来可以运行的项目突然不能启动了, 报形如Caused by: java.lang.ClassNotFoundException: javax.xml.bind.PropertyException的类找不到的错。

如何在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>
相关文章
|
11月前
|
Java 编译器 API
Java 密封类:精细化控制继承关系
Java 密封类:精细化控制继承关系
510 83
|
9月前
|
安全 Java 数据建模
Java记录类:简化数据载体的新选择
Java记录类:简化数据载体的新选择
471 101
|
9月前
|
安全 Java 开发者
Java记录类:简化数据载体的新方式
Java记录类:简化数据载体的新方式
374 100
|
10月前
|
安全 IDE Java
Java记录类型(Record):简化数据载体类
Java记录类型(Record):简化数据载体类
635 143
|
8月前
|
存储 Java 索引
用Java语言实现一个自定义的ArrayList类
自定义MyArrayList类模拟Java ArrayList核心功能,支持泛型、动态扩容(1.5倍)、增删改查及越界检查,底层用Object数组实现,适合学习动态数组原理。
351 4
|
8月前
|
IDE JavaScript Java
在Java 11中,如何处理被弃用的类或接口?
在Java 11中,如何处理被弃用的类或接口?
374 5
|
8月前
|
编解码 Java 开发者
Java String类的关键方法总结
以上总结了Java `String` 类最常见和重要功能性方法。每种操作都对应着日常编程任务,并且理解每种操作如何影响及处理 `Strings` 对于任何使用 Java 的开发者来说都至关重要。
464 5
|
8月前
|
JSON 网络协议 安全
【Java】(10)进程与线程的关系、Tread类;讲解基本线程安全、网络编程内容;JSON序列化与反序列化
几乎所有的操作系统都支持进程的概念,进程是处于运行过程中的程序,并且具有一定的独立功能,进程是系统进行资源分配和调度的一个独立单位一般而言,进程包含如下三个特征。独立性动态性并发性。
406 1
|
8月前
|
Java Go 开发工具
【Java】(8)正则表达式的使用与常用类分享
正则表达式定义了字符串的模式。正则表达式并不仅限于某一种语言,但是在每种语言中有细微的差别。
508 1
|
8月前
|
存储 Java 程序员
【Java】(6)全方面带你了解Java里的日期与时间内容,介绍 Calendar、GregorianCalendar、Date类
java.util 包提供了 Date 类来封装当前的日期和时间。Date 类提供两个构造函数来实例化 Date 对象。第一个构造函数使用当前日期和时间来初始化对象。Date( )第二个构造函数接收一个参数,该参数是从1970年1月1日起的毫秒数。
325 0