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 の場合