2011-05-28 146 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>列表中,然後運行。