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,但我将其更改为 java,因为 java.exe 在我的 Mac 上未被识别为命令)
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 simulationWithCurrentParams
与原始提示的主要区别是除去了星号,除了包含 jar 文件的文件夹和缩短基本类路径路径以仅捕获基本目录。还应使用“:”代替“;” 根据@reprogrammer 的回答,在 Mac 和 Linux 上