在Unix上运行.jar文件总是在NoClassDefFoundError异常中解析

时间:2015-12-10 13:15:30

标签: java unix exception jar manifest

我正在研究一个我希望在unix机器上运行的小程序。

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

javac CallACMDFromJAVA.java

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

CallACMDFromJAVA.class

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

jar cfm cmd.jar manifest.txt CallACMDFromJAVA.class

到目前为止,goo。最后一个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.access$100(URLClassLoader.java:71)
        at java.net.URLClassLoader$1.run(URLClassLoader.java:361)
        at java.net.URLClassLoader$1.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环境或其他方面的更多信息来帮助我?

1 个答案:

答案 0 :(得分:2)

你的班级显然是在一个包serviceCall。理想情况下,您应该使源目录结构与包结构匹配,因此您将源文件放在名为serviceCall的目录中。即使没有它,如果你用

编译它
javac -d . CallACMDFromJAVA.java

然后应该创建一个包含serviceCall的{​​{1}}目录。您应该尝试在将放入jar文件之前直接运行

CallACMDFromJAVA.class

...应该可以使用,而java serviceCall.CallACMDFromJAVA 会因使用现有工作流程而出现相同错误而失败。在将放入 jar文件之前,总是值得尝试而不用 jar文件。

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

serviceCall

然后它应该工作。基本上,您需要jar cfm cmd.jar manifest.txt serviceCall 属性来引用完全限定的类名,并且您需要相应的类文件位于jar文件中的合适目录中。

请注意,如果使用一个好的IDE,可能会为您处理所有目录结构。