从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),您需要将以下依赖项添加到类路径中:

我不确定为什么您认为maven无法处理多个主类;将其用于依赖项管理和标准Java编译时,多个主类应该没有问题。

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...