在多线程应用程序中编译时和运行时之间类路径不匹配的原因是什么?

时间:2012-05-24 17:59:08

标签: java multithreading swing classpath

我正在编写一个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:\解析器\ svnkit-1.7.4-V1 \ lib中\ svnkit-CLI-1.7.4-v1.jar; C:\解析器\ 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 :\解析器\ svnkit-1.7.4-V1 \ lib中\ svnkit-CLI-1.7.4-v1.jar; C:\解析器\ svnkit-1.7.4-V1 \ lib中\ svnkit-1.7.4-v1.jar “

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

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

  

C:\ MyJavaPrograms \ src>设置CLASSPATH =%CLASSPATH%; C:\ parsers \ svnkit-1.7.4-v1 \ lib \ svnkit-1.7.4-v1.jar; C:\ parsers \ svnkit-1.7 0.4-V1 \ lib中\ svnkit-CLI-1.7.4-v1.jar; C:\解析器\公地\公地琅2.4.jar

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

1 个答案:

答案 0 :(得分:8)

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

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

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