Java NoClassDefFoundError尽管设置了类路径

Java NoClassDefFoundError尽管设置了类路径,java,classpath,noclassdeffounderror,Java,Classpath,Noclassdeffounderror,我在让Java应用程序在控制台和/或Ant中运行时遇到了一些问题。 我知道很多初始问题都与类路径没有设置或设置不正确有关,尽管我相当肯定我设置的正确,所以我的搜索只产生了这方面的结果 以下是我的应用程序的一般设置: 类位于模型、视图和控制器包中。controller.controller是具有main方法的类。我使用objectdb作为我的JPA提供者 我正在使用Ant编译我的应用程序 编译后,我可以使用以下脚本从ant运行我的应用程序: <target name="run" descri

我在让Java应用程序在控制台和/或Ant中运行时遇到了一些问题。 我知道很多初始问题都与类路径没有设置或设置不正确有关,尽管我相当肯定我设置的正确,所以我的搜索只产生了这方面的结果

以下是我的应用程序的一般设置: 类位于模型、视图和控制器包中。controller.controller是具有main方法的类。我使用objectdb作为我的JPA提供者

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

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

<target name="run" description="default build process">
    <java fork="true" classname="${main-class}">
        <classpath>
            <path refid="classpath" />
        </classpath>
    </java>
</target>
因此,我尝试了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>
我已经将JAVA_HOME设置为JDK的路径,将CLASSPATH设置为JRE的/lib路径。 操作系统是Windows 7 64位,Java版本是1.6.0_25-b06

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

非常感谢您的帮助

虽然我很确定我设置正确

证据对你不利。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>


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

类路径应该包括

  • 包含类文件的目录(在其正确的包目录中)
  • jar文件

  • 不能将类路径指向JAR目录。运行应用程序服务器(例如Tomcat)时情况就不同了,它将为您从目录加载jar。

    我发现,当我在目标中指定
    jar=“…”
    时,就会发生这种情况。我删除了
    jar=“…”
    ,将
    .jar
    放在
    列表中,然后它运行。

    您在Manifest.MF文件中看到的类路径和主类条目是什么?Manifest版本:1.0 Ant版本:Apache Ant 1.7.1创建人:20.0-b11(Sun Microsystems Inc.)主类:controller.controller感谢到目前为止的回复。感谢回复。我确实在清单中指定了主类,正如我在上面的评论中所看到的那样。此外,在ant文件中,类路径指向两个文件夹(“类路径由/lib和/dist文件夹组成(应用程序的jar文件编译为/dist)”。我会在这里发布构建文件的定义,但是注释部分的格式不好。但是清单文件中没有jar位置。我认为-cp开关就是为了这个。如果这还不够,那么我如何在清单中设置位置?-cp是指定类路径的命令行方式。Ant没有e运行时对JAR文件的影响-这是一个构建工具。听起来你最好学习如何在JAR清单中设置类路径:我知道Ant只是一个构建工具。我知道-cp开关用于什么,它不是我的第一个Java应用程序:)我想我不需要在JAR文件中设置任何类路径,如果我用-cp指定它(我这样做)。我还尝试向清单中添加一个类路径:条目-无更改。
    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.
    
    <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>