使用外部 Jar 库的可执行 Jar 上的 NoClassDefFoundError
NoClassDefFoundError on Executable Jar with code using External Jar libs
我确信在某个时候有人问过这个问题并得到了回答,但我查看过的所有问题似乎都不适用于我或没有意义。
我不需要使用外部 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 中
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.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
在尝试了 IntelliJ 中的工件设置后,我终于弄明白了。
为了避免在可执行 JAR 旁边有一个单独的文件夹或 jar 文件,而不是将 JAR 库添加到 Artifact 的输出布局中,而是将其作为提取目录添加 类到 JAR 并且应用程序能够成功地利用 JAR 库中包含的方法。
我确信在某个时候有人问过这个问题并得到了回答,但我查看过的所有问题似乎都不适用于我或没有意义。
我不需要使用外部 jar 并且过去一直只使用 JDK 但我想确保我知道如何做到这一点。我创建了一个应用程序来计算和验证另一个文件的文件校验和,并将几个函数移动到外部 jar 以在我的代码中引用。
我正在使用 IntelliJ 作为我的 IDE。我可以从 IntelliJ 编译和 运行 代码,但当我创建可执行 JAR 文件并 运行 它时,我的 JAR 文件中引用的任何函数都会抛出 NoClassDefFoundError。我不确定我做错了什么。
我已经在清单 Class-Path
中列出了 JarManifest-Version: 1.0
Class-Path: lib/Utilities.jar
Main-Class: net.rethfam.checksumChecker.Main
我已确保 JAR 文件在项目依赖项中列出
并且要在 JAR 中导出
我什至使用 jar tf
验证了 jar 文件列在可执行 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.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
在尝试了 IntelliJ 中的工件设置后,我终于弄明白了。
为了避免在可执行 JAR 旁边有一个单独的文件夹或 jar 文件,而不是将 JAR 库添加到 Artifact 的输出布局中,而是将其作为提取目录添加 类到 JAR 并且应用程序能够成功地利用 JAR 库中包含的方法。