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 で失敗しました。

私はネットを検索し、次を使用してCLASSPATH環境変数にいくつかのjarファイルを追加することで問題を回避できました。

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を知ることができるように、クラスパスが必要です。FooFooBarB.jarB.jar

要するに、コンパイルするクラスパスの直接的な依存関係のみが必要です。ただし、プログラムを実行するには、クラスパスにすべての推移的な依存関係が必要です。

CLASSPATH 環境変数をいじってはいけません。プログラムのクラスパスを設定するには、常に -cp オプションを使用してください。

于 2012-05-24T18:06:34.523 に答える