2012-07-25 44 views
1

我是一位正在编写代码的医药科学专业的学生,​​所以我很抱歉如果这个问题的答案已经逃脱了我。编译成功但得到了NoClassDefFound错误

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

[[email protected]:~]$ cd chorus_jk 

[[email protected]:~/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 

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

100 warnings 

[[email protected]:~/chorus_jk]$ jar cfe ChorusJK_RA.jar Main_JK ./*.class 

[[email protected]:~/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错误。非常感谢您的帮助!

+0

CHorusJK_RA.jar中存在路径cern/colt/matrix/DoubleMatrix2D吗? – roymustang86 2012-07-25 13:36:29

+0

当我编译代码时,我将colt.jar包含在路径所在的库路径中。我的理解是,在编译时,ChorusJK_RA.jar应该包含所有必需的类。这是不正确的? – 2012-07-25 13:41:43

+0

编号ChorusJK_RA.jar里面不会包含colt.jar。如果您打算扩展您的项目并从命令行构建它,请考虑使用Maven或Gradle作为构建工具来为您管理依赖关系。 – 2012-07-25 13:47:44

回答

0

你在得到您的代码在命令行中运行困难演示了IDE的价值。如果我正确理解你的工作流程,你就用一台IDE在一台机器上开发了你的代码,然后你必须在没有GUI环境的另一台计算机上运行它,所以你被困在命令行中。这是相当普遍的,特别是对于Web应用程序开发。

Netbeans创建一个dist文件夹(发行版),您可以配置您的项目将库复制到lib文件夹(我认为这是默认行为)。包含在JAR文件中应该包含这样一行清单文件: 类路径:LIB/colt.jar

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

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

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

+0

编译器中存在一些差异,所以我选择上传我的java文件并从命令行进行编译以简化。我能够从jar中手动提取和更新清单文件。有效!我不知道为什么它在我将'-cp ./colt.jar'添加到命令行但是DID更改清单文件时不起作用。 – 2012-07-25 18:01:28

+0

我很高兴它的工作:) 当你说在编译器的差异,你的意思是不同版本的JVM(如1.6与Java 7)? – Thorn 2012-07-25 18:47:25

2

由于DoubleMatrix2D可能在该jar中,因此需要在运行应用程序时将colt.jar添加到类路径中。尝试

java -cp colt.jar -jar ChorusJK_RA.jar 

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

+0

我试了两个:java -cp ./colt.jar -jar ChorusJK_RA.jar – 2012-07-25 13:45:53

+0

我得到同样的错误。 – 2012-07-25 13:47:20

+0

我能够提取清单文件并设置“Class-Path:./colt.jar”...它工作正常!任何想法为什么当我在命令行中指定'-cp ./colt.jar'时它不会运行? – 2012-07-25 17:58:18

1

colt.jar包中的“cern.colt.matrix.DoubleMatrix2D”类是什么? 也许你应该把它添加到你的第二个电话的classpath中太:

java -cp colt.jar -jar ChorusJK_RA.jar 
+0

DoubleMatrix2D类位于colt.jar包中,是的。我在命令行上使用'less colt.jar'进行了验证。 – 2012-07-25 13:49:28

相关问题