Classpath正确编译,但不会运行。我错过了什么

时间:2010-02-20 18:23:42

标签: java linux mahout

问候,

我正在玩mahout,我写了一个基本的java类,它导入了一些库。编译时我的类路径似乎是正确的,我根本没有任何错误或抱怨。

然而,当我运行编译的类时,我得到一个例外,说明......

Exception in thread "main" java.lang.NoClassDefFoundError: Test
Caused by: java.lang.ClassNotFoundException: Test

4 个答案:

答案 0 :(得分:6)

我的猜测是.不在你的类路径上。例如,您可能正在编译:

javac -cp foo.jar:bar.jar Test.java

然后运行您需要的代码

java -cp foo.jar:bar.jar:. Test

您正在编译的代码不需要在类路径上,因为您提供代码(因此无法找到) - 这就是它设法编译但不运行的原因

当然,这只是猜测 - 如果您可以发布用于编译和运行代码的命令,那将有所帮助。

答案 1 :(得分:2)

  

我现在收到错误java.lang.NoClassDefFoundError: org/slf4j/LoggerFactory

您在课程路径上遗漏了slf4j-api.jar。使用SLF4J,您始终需要slf4j-api.jar和另一个jar bind a logging framework。实际上,如果您不关心日志记录,请使用slf4j-nop.jar代替slf4j-log12.jar

更新: Mahout似乎在Maven中央存储库中可用,因此使用Maven可以简化类路径设置过程。如果您不是在学习Maven,请考虑使用MOP这是一个命令行启动程序来运行Java内容,它可以透明地下载Maven工件及其依赖项并设置类路径。

答案 2 :(得分:1)

编译时间类路径听起来正确;运行时类路径是错误的。

来自该类的javadoc:

  

如果是Java虚拟机,则抛出   ClassLoader实例尝试加载   在一个类的定义中(作为一部分   正常方法调用或作为一部分   使用new创建一个新实例   表达式)并没有定义   可以找到课程。

     

搜索的类定义   当前执行时存在   类被编译,但定义   再也找不到了。

您是否在当前目录中看到Test.class文件?也许你误将其编译到另一条路径。

答案 3 :(得分:1)

如果您正在使用Mahout,请注意在使用Maven构建它之后,它将在目标/目录中生成“* .job”文件,其中包含打包在一起的所有依赖项。它只是一个.jar文件。