ClassNotFoundException问题是由几十个人发现的,但即便如此,我也没有在过去的答案中找到我的问题的答案:( 基本上我在尝试使用项目文档中提供的命令提示符从命令行运行大型开源程序时遇到ClassNotFoundException。提示如下:
java -cp "target/classes/*;../../Algotrader/code/target/classes/*;../../lib/*;../../target/*" -Dsimulation=true -DdataSource.dataSet=1year com.algoTrader.starter.SimulationStarter simulateWithCurrentParams
(注意:原始命令实际上是说java.exe,但是我将其更改为java,因为我的Mac上没有将java.exe识别为命令)
如堆栈跟踪所示, 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上运行它。
CORRECT CLASSPATH
最后,命令提示符中给出的类路径出错了。正确的路径(至少解决问题的路径)是:
java -cp“target / classes /:../../ Algotrader / code / target / classes /:target / *”-Dsimulation = true -DdataSource.dataSet = 1年com.algoTrader.starter.SimulationStarter simulateWithCurrentParams < / p>
与原始提示的主要区别在于除了包含jar文件的文件夹以及缩短基类路径以仅捕获基本目录之外的星星。还应使用“:”代替“;”在Mac和Linux上按照 @reprogrammer回答
答案 0 :(得分:2)
类路径语法与操作系统有关。 Linux和Mac OS X中的类路径分隔符为:
而非;
。
答案 1 :(得分:2)
您确定需要所有*
吗?
通常,您需要提供类路径的基目录,而不是子文件夹。
E.g。在将应用程序构建到“bin”时,您将使用java -cp bin mainclass
,而不是java -cp bin/*
!对*
的支持通常有点不稳定,因为它是一个shell元字符,你需要正确引用。如果你有一个不正确的类路径,它可以真的搞砸你。我见过人们有问题,因为他们将README.TXT
添加到他们的类路径中。