Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在多线程应用程序中,编译时和运行时之间类路径不匹配的原因是什么?_Java_Multithreading_Swing_Classpath - Fatal编程技术网

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

Java 在多线程应用程序中,编译时和运行时之间类路径不匹配的原因是什么?,java,multithreading,swing,classpath,Java,Multithreading,Swing,Classpath,我正在编写一个Swing桌面应用程序。我使用以下方法编译程序: C:\MyJavaPrograms\src>“C:\Program Files\Java\jdk1.7.0\u 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

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

C:\MyJavaPrograms\src>“C:\Program Files\Java\jdk1.7.0\u 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\u 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.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应用程序中,是什么导致编译时和运行时之间的类路径不匹配呢?有没有办法使所有环境变量和命令行选项对线程可用?

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

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


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

考虑使用Maven管理依赖项。我们的大型web应用程序中有大量的类路径。将其放在命令行上不是一个选项,因为它使
ps
无法读取。在这些情况下,我们总是在开始脚本中使用
CLASSPATH
env变量。如果它是一个环境变量,保持给定脚本的局部性,那么它当然是可以接受的。我的意思是避免使用全局类路径环境变量。在我的例子中,Foo和Bar都存在于同一个jar中,我为-cp选项指定了相同的值。我仍然不明白为什么NoClassDefFoundError会失败。有没有办法使所有环境变量和命令行选项对线程可用?我们也不知道,因为您没有说明异常堆栈跟踪是什么,以及类路径包含什么。JVM中的所有线程都可以访问相同的运行时类路径和相同的环境变量。您的问题与线程无关。错误发生在SwingWorker内部的事实只意味着SwingWorker是第一个加载类路径中缺少的类的人。