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