使用外部Jar库的代码在可执行Jar上出现NoClassDefFoundError

时间:2019-03-30 01:35:00

标签: java intellij-idea jar executable-jar

我确定已经有人问过并回答了这个问题,但是我已经审查过的所有问题似乎都不适用于我或没有任何意义。

我不需要使用外部jar,过去一直只使用JDK,但想确保我知道该怎么做。我创建了一个应用程序来计算和验证针对另一个文件的文件校验和,并将几个函数移至外部jar中以在我的代码中进行引用。

我正在使用IntelliJ作为我的IDE。我可以通过IntelliJ很好地编译和运行代码,但是当我创建可执行JAR文件并运行它时,JAR文件中引用的任何函数都会引发NoClassDefFoundError。我不确定自己在做什么错。

我已在清单Class-Path中列出了Jar。

Manifest-Version: 1.0
Class-Path: lib/Utilities.jar
Main-Class: net.rethfam.checksumChecker.Main

我已确保JAR文件列在项目依赖项中

并将其导出到JAR中

我什至已经使用jar tf验证了可执行文件中列出了jar文件

jar tf ChecksumChecker.jar
META-INF/MANIFEST.MF
lib/
lib/Utilities.jar
META-INF/
net/
net/rethfam/
net/rethfam/checksumChecker/
net/rethfam/checksumChecker/controllers/
net/rethfam/checksumChecker/controllers/MainScreenController$1.class
net/rethfam/checksumChecker/controllers/MainScreenController.class
net/rethfam/checksumChecker/images/
net/rethfam/checksumChecker/images/checkImage-128x128.png
net/rethfam/checksumChecker/images/checkImage-16x16.png
net/rethfam/checksumChecker/images/checkImage-256x256.png
net/rethfam/checksumChecker/images/checkImage-32x32.png
net/rethfam/checksumChecker/images/checkImage-512x512.png
net/rethfam/checksumChecker/images/checkImage-64x64.png
net/rethfam/checksumChecker/images/CheckSumIcon.ico
net/rethfam/checksumChecker/images/Origional/
net/rethfam/checksumChecker/images/Origional/checkImage-Orig.png
net/rethfam/checksumChecker/Main.class
net/rethfam/checksumChecker/views/
net/rethfam/checksumChecker/views/MainScreen.fxml
Utilities.jar

在这一点上,我最终茫然无措,厌倦了撞墙撞头。我不觉得这应该这么困难。

Caused by: java.lang.NoClassDefFoundError: rethfam/ultis/fileUtils
    at net.rethfam.checksumChecker.controllers.MainScreenController.handleFileChooser(MainScreenController.java:68)
    ... 58 more
Caused by: java.lang.ClassNotFoundException: rethfam.ultis.fileUtils
    at java.net.URLClassLoader.findClass(URLClassLoader.java:382)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
    at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:349)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
    ... 59 more

1 个答案:

答案 0 :(得分:0)

我在弄懂IntelliJ中的工件设置后终于能够弄清楚。

为了避免在可执行JAR旁边需要有单独的文件夹或jar文件,而不是将JAR库添加到工件的输出布局中,而是将其添加为提取目录,将类添加到JAR和应用程序中能够成功利用JAR库中包含的方法。