如何解决从Java 8迁移独立的Java应用程序到JDK11时发生NoClassDefFoundError
将独立的Java应用程序从Java8迁移到JDK11后,出现以下错误。
Exception in thread "main" java.lang.reflect.InvocationTargetException
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
at java.base/java.lang.reflect.Method.invoke(Unknown Source)
Caused by: java.lang.NoClassDefFoundError: javax/xml/bind/ValidationEventHandler
Caused by: java.lang.ClassNotFoundException: javax.xml.bind.ValidationEventHandler
at java.base/java.lang.ClassLoader.loadClass(Unknown Source)
at java.base/java.lang.ClassLoader.loadClass(Unknown Source)
了解JDK11中没有包含jre,因此使用jlink创建了自定义jre图像,但是jdk11中似乎已弃用模块java.se.ee,因此java.xml.bind无法正常工作。
我已经尝试过但无法使用的选项。
1.classpath包含依赖罐-忽略classpath参数。我在这里发现了相同的问题-Run an executable JAR with external class path。
2.Configure module.info-失败,错误为“可从多个模块访问”。我在这里发现了相同的问题-Eclipse is confused by imports ("accessible from more than one module")。
我看到许多建议将项目转换为Maven并向pom添加依赖项jar。该应用程序是由源系统触发的标准Java批处理应用程序。有很多主类是根据传递的类名和参数执行的,我认为通过maven我们不能调用多个主类。
我正在寻找一种解决方案,其中使用jlink创建的jre图像可用于此Java应用程序。
解决方法
某些类已移出JDK(例如JAXB),您需要将以下依赖项添加到类路径中:
- JAXB-API: https://mvnrepository.com/artifact/javax.xml.bind/jaxb-api/2.4.0-b180830.0359
- JAXB运行时: https://mvnrepository.com/artifact/org.glassfish.jaxb/jaxb-runtime/2.4.0-b180830.0438
我不确定为什么您认为maven无法处理多个主类;将其用于依赖项管理和标准Java编译时,多个主类应该没有问题。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。