运行 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.class
的 serviceCall
目录。你应该尝试 运行 直接 在 将它放入 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,所有目录结构都可能为您处理。
我正在开发一个 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.class
的 serviceCall
目录。你应该尝试 运行 直接 在 将它放入 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,所有目录结构都可能为您处理。