Java NoClassDefFoundError尽管设置了classpath

Tob*_*ias 8 java classpath noclassdeffounderror

我在使用控制台和/或Ant运行Java应用程序时遇到了一些麻烦.我知道很多启动问题与类路径没有设置或设置不正确有关,虽然我很确定我设置正确,所以我的搜索只产生了结果.

以下是我的应用程序的一般设置:类在包模型,视图和控制器中.controller.Controller是主方法的类.我使用objectdb作为我的JPA提供程序.

我正在使用Ant来编译我的应用程序.

编译之后,我可以使用以下脚本从ant运行我的应用程序:

<target name="run" description="default build process">
    <java fork="true" classname="${main-class}">
        <classpath>
            <path refid="classpath" />
        </classpath>
    </java>
</target>
Run Code Online (Sandbox Code Playgroud)

其中$ {main-class}是controller.Controller和classpath由/ lib和/ dist文件夹组成(应用程序的jar文件被编译为/ dist)

现在,我尝试了所有的.jar文件复制从/ lib和/ DIST到一个单独的文件夹,并运行他们java -jar cooking.jar -cp .导致

Exception in thread "main" java.lang.NoClassDefFoundError: javax/persistence/Persistence
    at model.jpa.JPAModelFactory.<init>(JPAModelFactory.java:28)
    at model.jpa.JPAModelFactory.<init>(JPAModelFactory.java:24)
    at controller.Controller.<init>(Controller.java:59)
    at controller.Controller.main(Controller.java:116)
Caused by: java.lang.ClassNotFoundException: javax.persistence.Persistence
    at java.net.URLClassLoader$1.run(Unknown Source)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.net.URLClassLoader.findClass(Unknown Source)
    at java.lang.ClassLoader.loadClass(Unknown Source)
    at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source)
    at java.lang.ClassLoader.loadClass(Unknown Source)
    ... 4 more
Run Code Online (Sandbox Code Playgroud)

所以我尝试了ant并略微修改了上面的构建目标:

<target name="run2" description="default build process">
    <java fork="true" jar="${dist.dir}/${ant.project.name}.jar">
        <classpath>
            <path refid="classpath" />
        </classpath>
    </java>
</target>
Run Code Online (Sandbox Code Playgroud)

这会导致相同的错误.我不明白为什么.

只是为了测试它,我尝试直接指定主类从命令行运行:java -cp . controller.Controller由于某种原因甚至找不到类(它在那里,我确认了):

Exception in thread "main" java.lang.NoClassDefFoundError: controller/Controller
Caused by: java.lang.ClassNotFoundException: controller.Controller
    at java.net.URLClassLoader$1.run(Unknown Source)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.net.URLClassLoader.findClass(Unknown Source)
    at java.lang.ClassLoader.loadClass(Unknown Source)
    at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source)
    at java.lang.ClassLoader.loadClass(Unknown Source)
Could not find the main class: controller.Controller.  Program will exit.
Run Code Online (Sandbox Code Playgroud)

我已将JAVA_HOME设置为JDK的路径,将CLASSPATH设置为JRE的/ lib路径.操作系统是Windows 7 64位,Java版本是1.6.0_25-b06

我对两件事情感到困惑:a)为什么Java无法找到controller.Controller,即使它存在于.jar文件中,而.jar文件也在当前目录中?b)用-jar调用Java似乎弄乱了查找机制,我做错了什么.

任何帮助都非常感谢.

duf*_*ymo 1

虽然我相当确定我设置正确

证据对你不利。JVM 告诉你你没有正确设置它。

您认为 ref 'classpath' 指向什么?您认为它的值来自哪里?它们应该在 Ant build.xml 中定义,对吧?像这样:

<path id="production.class.path">
    <pathelement location="${production.classes}"/>
    <pathelement location="${production.resources}"/>
    <fileset dir="${production.lib}">
        <include name="**/*.jar"/>
        <exclude name="**/junit*.jar"/>
        <exclude name="**/*test*.jar"/>
    </fileset>
</path>

<path id="test.class.path">                            
    <path refid="production.class.path"/>
    <pathelement location="${test.classes}"/>
    <pathelement location="${test.resources}"/>
    <fileset dir="${test.lib}">
        <include name="**/junit*.jar"/>
        <include name="**/*test*.jar"/>
    </fileset>
</path>
Run Code Online (Sandbox Code Playgroud)

如果您要创建可执行 JAR,则需要在清单中指定主类和类路径,正如 CoolBeans 在注释中正确指出的那样。3rd 方 JAR 位置必须相对于可执行 JAR。您应该将它们与可执行 JAR 一起打包,以便相对路径易于整理和理解。