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,但我将其更改为 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 上

4

2 回答 2

3

类路径语法取决于操作系统。Linux 和 Mac OS X 中的类路径分隔符:不是;.

于 2012-11-28T00:33:30.370 回答
3

你确定你需要那里的所有*东西吗?

通常,您需要提供类路径的基本目录,而不是子文件夹。

例如,当将您的应用程序构建到“bin”中时,您将使用java -cp bin mainclass,而不是java -cp bin/*!对的支持*通常有点不稳定,因为它是一个 shell 元字符,您需要正确引用。如果你有一个不正确的类路径,它真的会搞砸你。我见过人们因为添加README.TXT到类路径而遇到问题。

于 2012-11-28T00:37:44.530 回答