成功编译但获得NoClassDefFounderror

时间:2012-07-25 13:31:27

标签: java unix

我是一名正在学习编码的制药科学专业的学生,​​所以如果这个问题的答案逃脱了我,我会道歉。

我在NetBeans AND Eclipse中编写了一些java源代码。代码在两个IDE中运行良好,但是当我将所有.java文件移动到UNIX环境时,我成功编译了代码,但是命令行告诉我它找不到位于同一个jar中的类。我编译了。我收到了有关编译的警告,但我认为这不会影响代码的运行。我搜索和搜索,似乎无法找到答案。这是我的命令行代码(有我的程序名称等):

[jknights@u2:~]$ cd chorus_jk

[jknights@u2:~/chorus_jk]$ ls
Chorus_JK.java       EntropyNormal_JK.java   Main_JK.java
colt.jar             EstimateParzen_JK.java  RA_reformatted_forCHORUS_JK.txt
Combination_JK.java  LIST_JK.java

[jknights@u2:~/chorus_jk]$ javac -cp colt.jar ./*.java -Xlint:unchecked
.
.  (I edited out the 100 warnings as they refer to unchecked items)
.

100 warnings

[jknights@u2:~/chorus_jk]$ jar cfe ChorusJK_RA.jar Main_JK ./*.class

[jknights@u2:~/chorus_jk]$ java -jar ChorusJK_RA.jar
89
317504
Exception in thread "main" java.lang.NoClassDefFoundError: cern/colt/matrix/DoubleMatrix2D
    at Chorus_JK.init(Chorus_JK.java:24)
    at Main_JK.main(Main_JK.java:23)
Caused by: java.lang.ClassNotFoundException: cern.colt.matrix.DoubleMatrix2D
    at java.net.URLClassLoader$1.run(URLClassLoader.java:217)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.net.URLClassLoader.findClass(URLClassLoader.java:205)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:321)
    at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:294)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:266)
    ... 2 more

“89”和“317504”是读入的文件的摘要输出,因此看起来编译成功;但是,当程序到达计算部分时,它在线程“main”中给出了异常java.lang.NoClassDefFoundError:cern / colt / matrix / DoubleMatrix2D错误。非常感谢您的帮助!

3 个答案:

答案 0 :(得分:2)

您需要在运行应用程序时将colt.jar添加到classpath,因为DoubleMatrix2D可能在该jar中。尝试

 java -cp colt.jar -jar ChorusJK_RA.jar

它适用于IDE,因为它们默认将jar添加到类路径中。

答案 1 :(得分:1)

colt.jar包中的“cern.colt.matrix.DoubleMatrix2D”类是什么? 也许您应该将它添加到第二次调用的类路径中:

java -cp colt.jar -jar ChorusJK_RA.jar

答案 2 :(得分:0)

从命令行运行代码的难度证明了IDE的价值。如果我正确理解您的工作流程,您在一台带有IDE的计算机上开发了代码,那么您必须在没有GUI环境的情况下在另一台计算机上运行它,因此您无法使用命令行。这很常见,特别是对于Web应用程序开发。

Netbeans创建了一个dist文件夹(发布),您可以配置项目将库复制到lib文件夹(我认为这是默认行为)。 jar文件中包含的清单文件应该包含如下所示的行: Class-Path:lib / colt.jar

您可以使用zip工具或在IDE中检查jar文件的内容。在文件视图的netbeans中,您可以展开dist文件夹,然后展开jar以检查其内容。

在将代码从图形环境移动到命令行之前,请尝试在没有IDE的情况下运行程序。您应该能够双击/ dist文件夹中的jar文件,它应该运行。如果是,那么您应该能够将整个/ dist文件夹移动到具有不同操作系统的其他计算机,并且它仍然应该运行而无需将-cp colt.jar添加到命令行参数。

您不需要重新编译代码,以使其在不同的操作系统上运行。只需移动/ dist文件夹即可体验“一次编写,随处运行”的乐趣。