使用外部Jar库的代码的可执行jar上的NoClassDefFoundError [复制]

问题描述 投票:0回答:1

这个问题在这里已有答案:

我确信在某些时候已经提出这个要求并回答,但我所审查的所有问题似乎都不适用于我或没有意义。

我不需要使用外部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文件列在Project Dependencies中

并且它将在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$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
java intellij-idea jar executable-jar
1个回答
0
投票

在使用IntelliJ中的工件设置后,我终于弄明白了。

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

© www.soinside.com 2019 - 2024. All rights reserved.