3

我正在编写一个 Swing 桌面应用程序。我使用以下方法编译我的程序:

C:\MyJavaPrograms\src>"C:\Program Files\Java\jdk1.7.0_04\bin\javac" SVNTool.java -cp ".;C:\parsers\commons\commons-lang-2.4.jar;C: \parsers\svnkit-1.7.4-v1\lib\svnkit-cli-1.7.4-v1.jar;C:\parsers\svnkit-1.7.4-v1\lib\svnkit-1.7.4-v1.jar"

我使用以下方法调用我的程序:

C:\MyJavaPrograms\src>"C:\Program Files\Java\jdk1.7.0_04\bin\java" SVNTool -cp ".;C:\parsers\commons\commons-lang-2.4.jar;C:\parsers \svnkit-1.7.4-v1\lib\svnkit-cli-1.7.4-v1.jar;C:\parsers\svnkit-1.7.4-v1\lib\svnkit-1.7.4-v1.jar"

它编译得很好。它开始很好。但是当我单击该按钮时,它会创建一个 SwingWorker 线程,但该线程因 NoClassDefFoundError 而失败。

我已经搜索了网络,并且能够通过使用以下方法将一些 jar 文件添加到 CLASSPATH 环境变量中来解决该问题:

C:\MyJavaPrograms\src>set CLASSPATH=%CLASSPATH%;C:\parsers\svnkit-1.7.4-v1\lib\svnkit-1.7.4-v1.jar;C:\parsers\svnkit-1.7.4- v1\lib\svnkit-cli-1.7.4-v1.jar;C:\parsers\commons\commons-lang-2.4.jar

那么,是什么导致了多线程 Swing 应用程序中编译时和运行时之间的类路径不匹配?有没有办法让线程可以使用所有环境变量和命令行选项?

4

1 回答 1

8

线程与您的问题无关。假设您在源文件中使用Foo库中的类。A.jar要编译您的类,您需要A.jar在类路径中,以便编译器能够了解Foo、其方法、字段等。但是如果 的代码Foo依赖于 中的另一个类BarB.jar您还需要B.jar在运行时类路径中。

简而言之,只需要类路径中的直接依赖即可编译。但是你需要类路径中的所有传递依赖来运行程序。

你不应该弄乱 CLASSPATH 环境变量。始终使用 -cp 选项来设置程序的类路径。

于 2012-05-24T18:06:34.523 回答