• 如果您觉得本站非常有看点,那么赶紧使用Ctrl+D 收藏吧

Java NoClassDefFoundError尽管设置了类路径

java 来源:Tobias 7次浏览

我在获取Java应用程序在控制台和/或Ant中运行时遇到了一些麻烦。 我知道很多开始的问题都与没有设置或错误设置的类路径有关,尽管我相当肯定我设置正确,所以我的搜索只能得到结果。Java NoClassDefFoundError尽管设置了类路径

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

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

编译后,我可以从蚂蚁用下面的脚本运行我的应用程序:

<target name="run" description="default build process"> 
    <java fork="true" classname="${main-class}"> 
     <classpath> 
      <path refid="classpath" /> 
     </classpath> 
    </java> 
</target> 

,其中$ {主级}是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 

于是,我就和蚂蚁上面构建目标略微修改为:

<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 -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. 

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

我两件事情感到困惑: 一)为什么就是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打包它们,以便相对路径易于理解和理解。


版权声明:本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系管理员进行删除。
喜欢 (0)