2011-05-28 130 views
8

我在获取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时做错了什么,似乎弄乱了查找机制。

任何帮助,高度赞赏。

+0

你在Manifest.MF文件中看到什么类路径和Main-class条目? – CoolBeans 2011-05-28 20:48:42

+0

Manifest-Version:1.0 Ant-Version:Apache Ant 1.7.1 创建人:20.0-b11(Sun Microsystems Inc.) 主要类:controller.Controller – Tobias 2011-05-29 15:24:24

回答

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> 

如果要创建一个可执行的JAR,你需要在清单中指定主类和类路径,如CoolBeans正确的评论中指出。第三方JAR位置必须与可执行JAR相关。您应该用可执行JAR打包它们,以便相对路径易于理解和理解。

+0

感谢您的回复。 – Tobias 2011-05-29 15:23:58

+0

感谢您的回复。我在清单中指定了主要类,正如我在上面的评论中可以看到的那样。此外,在ant文件classpath中指向两个文件夹(“和classpath由/ lib和/ dist文件夹组成(应用程序的jar文件被编译为/ dist)”。我会在这里发布我的构建文件的定义,但是注释部分没有很好的格式化,但是清单文件中没有jar位置,但我认为这是-cp开关的作用,如果这还不够,那么我如何设置清单中的位置? – Tobias 2011-05-29 15:33:24

+0

-cp是指定classpath的命令行方式,Ant在运行时对你的JAR文件没有影响 - 这是一个构建工具,听起来你最好学习如何在JAR的清单中设置classpath:http:/ /download.oracle.com/javase/tutorial/deployment/jar/downman.html – duffymo 2011-05-29 20:29:49

2

类路径应该由

  1. 目录与类文件(在其适当的包目录)
  2. jar文件。

您无法将类路径指向jars目录。当运行一个应用服务器(例如Tomcat)时,情况会有所不同,它将为您加载一个目录中的jar。

0

我发现这种情况发生时,我指定<classpath>jar="..."在目标。我删除了jar="...",将.jar放入<classpath>列表中,然后运行。