尝试从命令行运行时NoClassDefFoundError

时间:2014-02-27 03:47:47

标签: java noclassdeffounderror

提前道歉 - 我知道有很多很多非常相似的问题,但我想问一些与我的情况有关的事情。

我在同一目录中有一堆java和jar文件。我能够编译好,因此最终在同一个目录中有许多类文件。但是当我去执行程序时,它会给出一个NoClassDefFoundError,说它无法找到指定的类:

C:\Users\DB\Desktop\nextreports-integration-demo\src\ro\nextreports\integration>
java -cp ".;*.jar" SimpleDemo
Exception in thread "main" java.lang.NoClassDefFoundError: SimpleDemo (wrong nam
e: ro/nextreports/integration/SimpleDemo)

我从更高级别的目录尝试了同样的事情,但没有区别:

C:\Users\DB\Desktop\nextreports-integration-demo\src>java -cp ".\ro\nextreports\
integration\*.jar;.\ro\nextreports\integration" SimpleDemo
Exception in thread "main" java.lang.NoClassDefFoundError: SimpleDemo (wrong nam
e: ro/nextreports/integration/SimpleDemo)

源文件中的package语句是:

package ro.nextreports.integration;

我有一种感觉,我忽略了一些非常基本的东西。提前谢谢。

编辑:非常感谢。它适用于以下内容:

java -cp ".\ro\nextreports\integration\nextreports-engine-6.3.jar;.\ro\nextreports\integration\commons-jexl-2.1.1.jar;.\ro\nextreports\integration\commons-logging-1.1.1.jar;.\ro\nextreports\integration\derby-10.10.1.1.jar;.\ro\nextreports\integration\itext-2.1.7.jar;.\ro\nextreports\integration\itext-rtf-2.1.7.jar;.\ro\nextreports\integration\itextpdf-5.0.6.jar;.\ro\nextreports\integration\jcalendar-1.3.2.jar;.\ro\nextreports\integration\jcommon-1.0.15.jar;.\ro\nextreports\integration\jfreechart-1.0.12.jar;.\ro\nextreports\integration\jofc2-1.0.1.jar;.\ro\nextreports\integration\mysql-connector-java-5.1.23-bin.jar;.\ro\nextreports\integration\mysql-connector-java-5.1.23-bin.jar;.\ro\nextreports\integration\poi-3.7.jar;.\ro\nextreports\integration\winstone-lite-0.9.10.jar;.\ro\nextreports\integration\xstream-1.3.1.jar;" ro.nextreports.integration.SimpleDemo

但为什么我不能在* .jar文件中使用通配符?例如,以下导致任何jar文件中的类的NoClassDefFoundError我没有明确说明:

java -cp ".;.\ro\nextreports\integration\*.jar" ro.nextreports.integration.
SimpleDemo

1 个答案:

答案 0 :(得分:1)

假设这是您的目录树:

src/
   ro/
     nextreports/
       integration/
         SimpleDemo.class

从您的包声明中,您编译的类应该在integration子目录中。检查该目录中是否确实存在SimpleDemo.class。如果这是正确的,它的类路径包括src目录的内容。

这意味着,如果您没有任何JAR依赖项,则可以从src目录运行您的应用程序,如下所示:

java -cp . ro.nextreports.integration.SimpleDemo

您需要使用完全限定的类名。

既然你有jar,你也必须将它们包含在类路径中。假设你在src上面的目录中有one JAR,在当前目录中有another,你可以使用:

java -cp ../one.jar;another.jar;. ro.nextreports.integration.SimpleDemo

如果从另一个目录运行它,如果查看类路径的相关目录或使用绝对目录来描述类路径,它仍然可以工作。我不确定,但通常当前目录始终由java可执行文件包含在类路径中。