繁体   English   中英

成功编译但得到NoClassDefFound错误

[英]successful compile but getting NoClassDefFound error

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

我在NetBeans和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错误。 非常感谢您的帮助!

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

 java -cp colt.jar -jar ChorusJK_RA.jar

它在IDE中工作,因为它们默认将jar添加到类路径。

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

java -cp colt.jar -jar ChorusJK_RA.jar

从命令行运行代码的难度证明了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文件夹即可体验“一次编写,随处运行”的乐趣。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM