运行 Unix 上的 .jar 文件总是解析为 NoClassDefFoundError 异常

Run a .jar file on Unix always resolves in a NoClassDefFoundError Exception

我正在开发一个 java 小程序,我想在 unix 机器上 运行。

首先,我编译了 .java 文件,没有任何错误。

javac CallACMDFromJAVA.java

然后我的 .class 文件就创建好了。

CallACMDFromJAVA.class

然后我使用jar命令创建了一个可执行文件.jar

jar cfm cmd.jar manifest.txt CallACMDFromJAVA.class

到目前为止一切顺利。最后一个 cmd 给了我一个 cmd.jar 文件。 但是当我想 运行 它时,突然出现了一些错误。我输入了:

java -jar cmd.jar

错误:

Exception in thread "main" java.lang.NoClassDefFoundError: CallACMDFromJAVA (wrong name: serviceCall/CallACMDFromJAVA)
        at java.lang.ClassLoader.defineClass1(Native Method)
        at java.lang.ClassLoader.defineClass(ClassLoader.java:800)
        at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:142)
        at java.net.URLClassLoader.defineClass(URLClassLoader.java:449)
        at java.net.URLClassLoader.access0(URLClassLoader.java:71)
        at java.net.URLClassLoader.run(URLClassLoader.java:361)
        at java.net.URLClassLoader.run(URLClassLoader.java:355)
        at java.security.AccessController.doPrivileged(Native Method)
        at java.net.URLClassLoader.findClass(URLClassLoader.java:354)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:425)
        at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:308)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:358)
        at sun.launcher.LauncherHelper.checkAndLoadMain(LauncherHelper.java:482)

您是否需要有关 java 环境或其他方面的更多信息来帮助我?

您的 class 显然在包裹 serviceCall 中。理想情况下,您应该使源目录结构与包结构相匹配,这样源文件就位于名为 serviceCall 的目录中。即使没有它,如果你用

编译它
javac -d . CallACMDFromJAVA.java

然后应该创建一个包含 CallACMDFromJAVA.classserviceCall 目录。你应该尝试 运行 直接 将它放入 jar 文件之前:

java serviceCall.CallACMDFromJAVA

... 这应该有效,而 java CallACMDFromJAVA 使用您现有的工作流程会失败并出现相同的错误。在将它放入 jar 文件之前,在没有 jar 文件的情况下尝试它总是值得的。

然后您需要将清单中的 Main-Class 更改为 serviceCall.CallACMDFromJAVA,并创建包含 serviceCall 目录的 jar 文件,例如

jar cfm cmd.jar manifest.txt serviceCall

那么应该可以了。基本上,您需要 Main-Class 属性来引用完全限定的 class 名称,并且需要相应的 class 文件位于 jar 文件中的合适目录中。

请注意,如果您使用得当 IDE,所有目录结构都可能为您处理。