0

ClassNotFoundException の質問は SO で数十件見つかりましたが、それでも過去の回答で私の問題に対する答えが見つかりませんでした:(基本的に、コマンドプロンプトを使用してコマンドラインから大規模なオープンソースプログラムを実行しようとすると ClassNotFoundException が発生しますプロジェクトのドキュメントで提供されています。プロンプトは次のとおりです。

java -cp "target/classes/*;../../Algotrader/code/target/classes/*;../../lib/*;../../target/*" -Dsimulation=true -DdataSource.dataSet=1year com.algoTrader.starter.SimulationStarter simulateWithCurrentParams

(注: 元のコマンドは実際には java.exe と表示されていますが、Mac では java.exe がコマンドとして認識されないため、java に変更しました)

スタック トレースに示されているように、 SimulationStarterクラスに対して例外がスローされます。

Exception in thread "main" java.lang.NoClassDefFoundError: com/algoTrader/starter/SimulationStarter
Caused by: java.lang.ClassNotFoundException: com.algoTrader.starter.SimulationStarter
    at java.net.URLClassLoader$1.run(URLClassLoader.java:202)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.net.URLClassLoader.findClass(URLClassLoader.java:190)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:306)
    at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:301)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:247)

Eclipse から、SimulationStarter.class がAlgoTrader/code/target/classes/com/algoTrader/starterにあることがわかります。これは、コマンド プロンプトで指定されたパスと一致しています。

私の質問は、クラスがクラスパスに誤って配置されている以外に、この例外の原因は何でしょうか?

また、これが違いを生むかどうかはわかりませんが、プロジェクトはsvnとMavenの下に保持されており、Macで実行しています。

正しいクラスパス

結局、コマンド プロンプトで指定されたクラスパスに問題がありました。正しいパス (少なくとも問題を解決するパス) は次のとおりです。

java -cp "target/classes/:../../Algotrader/code/target/classes/:target/*" -Dsimulation=true -DdataSource.dataSet=1year com.algoTrader.starter.SimulationStarter simulateWithCurrentParams

元のプロンプトとの主な違いは、jar ファイルを含むフォルダーを除いてスターが削除されていることと、基本クラスパス パスが短縮されて基本ディレクトリのみがキャプチャされることです。また、「;」の代わりに「:」を使用する必要があります。@reprogrammer の回答による Mac および Linux の場合

4

2 に答える 2

3

そこにすべて必要*ですか?

通常、サブフォルダーではなく、クラスパスのベース ディレクトリを指定します。

たとえば、アプリケーションを「ビン」にビルドする場合java -cp bin mainclass、 ではなくを使用しますjava -cp bin/*。のサポート*は、シェルのメタキャラクターであるため、一般的に少し不安定であり、引用を正しく行う必要があります。クラスパスが間違っていると、本当にうんざりしてしまいます。README.TXTクラスパスに追加したために問題が発生した人を見てきました。

于 2012-11-28T00:37:44.530 に答える
3

クラスパスの構文は OS に依存します。Linux および Mac OS X のクラスパス セパレーターは ではあり:ません;

于 2012-11-28T00:33:30.370 に答える