java打包成可执行jar时出现NoClassDefFoundError?

java新手提问,请各位大佬帮忙解答为谢!!!

在java中引入第三方jar包,使用gradle将我的项目打包成可执行的jar时并运行时报错:
image.png
第三方给的这个jar包结构如下:
image.png
我理解NoClassDefFoundError:javax/xml/transform/e应该是class文件的路径不对,按道理是jar包中class的路径javax/xml/transform/e,但是为什么看到的是javax.xml/transform/e呢。
在IDEA中运行代码是没问题的,但是打包成jar后通过 java -jar test.jar后就会报错,请问什么原因引起的呢。

我的gralde配置文件如下:image.png

请大神帮忙解答下如何解决呀,十分感谢!!!

运行无报错

阅读 1.5k
avatarAI BotBETA

出现 NoClassDefFoundError 通常意味着在运行时找不到特定的类。在你的情况下,它表示 javax.xml.transform.Error 类未找到。

看起来你的问题是在打包成可执行JAR文件后,无法找到 javax.xml.transform.Error 类。这个类应该是包含在 javax.xml.transform.jar 这个JAR文件中。

你的Gradle配置文件显示你正在使用 dependencies 来引入 javax.xml.transform.jar,这应该没错。我注意到你使用的是 implementation,这应该会把依赖的JAR文件打包到你的应用中。

一个可能的原因是,你在IDEA中运行代码时,IDEA会自动把项目依赖的JAR文件添加到运行时的classpath中,但在你通过命令行运行JAR文件时,这个自动添加的过程并没有发生。因此,你需要确保在命令行运行时,也要把依赖的JAR文件添加到classpath中。

你可以试试以下的命令来运行你的JAR文件:

java -cp path/to/your/jar:path/to/your/dependency.jar YourMainClass

在这个命令中,-cp 参数后面跟着的是classpath,多个路径之间用冒号(:)分隔。你需要把 path/to/your/jarpath/to/your/dependency.jar 替换成你的JAR文件和依赖的JAR文件的实际路径,同时把 YourMainClass 替换成你的主类名。

另外,你也可以在你的Gradle脚本中添加一个 bootJar 任务来自动创建包含所有依赖的“最终”JAR文件:

bootJar {
    from { configurations.runtimeClasspath.collect { it.isDirectory() ? it : zipTree(it) } }
}

这个任务会把所有运行时的依赖都包含在生成的JAR文件中,这样你就可以直接通过 java -jar your-app.jar 来运行你的应用了。

2 个回答
✓ 已被采纳

切换到JDK1.8版本就可以,一开始的用JDK20,应该是在高版本的JDK中java.xml.transform包已经不支持了。

你是否开启了idea的压缩空包功能?
image.png 开启这个后,项目路径里空的包会显示为.xxx

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
宣传栏