我正在编写一个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应用程序中编译时和运行时之间的类路径不匹配?有没有办法让线程可以使用所有环境变量和命令行选项?
答案 0 :(得分:8)
线程与您的问题无关。假设您在源文件中使用库Foo
中的类A.jar
。要编译您的类,您需要在类路径中A.jar
,以便编译器能够了解Foo
,其方法,字段等。但是如果Foo
的代码依赖于另一个类Bar
位于B.jar
中,在运行时类路径中也需要B.jar
。
简而言之,您只需要编译类路径中的直接依赖项。但是您需要类路径中的所有传递依赖项来运行程序。
您不应该乱用CLASSPATH环境变量。始终使用-cp选项设置程序的类路径。