有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java运行一个。Unix上的jar文件总是在NoClassDefFoundError异常中解析

我正在开发一个小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.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) 个答案

  1. # 1 楼答案

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

    javac -d . CallACMDFromJAVA.java
    

    然后应该创建一个serviceCall目录,其中包含CallACMDFromJAVA.class。在将其放入jar文件之前,您应该尝试直接运行它:

    java serviceCall.CallACMDFromJAVA
    

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

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

    jar cfm cmd.jar manifest.txt serviceCall
    

    那么它应该会起作用。基本上,需要Main-Class属性来引用完全限定的类名,并且需要相应的类文件位于jar文件中的适当目录中

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