1

我是一名制药科学专业的学生,​​我边走边学,所以如果这个问题的答案没有让我知道,我深表歉意。

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

4

3 回答 3

2

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

 java -cp colt.jar -jar ChorusJK_RA.jar

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

于 2012-07-25T13:37:34.880 回答
1

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

java -cp colt.jar -jar ChorusJK_RA.jar
于 2012-07-25T13:37:43.117 回答
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 文件夹,您就应该体验“一次编写,随处运行”的乐趣。

于 2012-07-25T14:14:42.340 回答