2011-09-30 43 views
1

基本上,我試圖運行一個使用ANT構建文件創建的JAR文件。該程序需要使用外部jar才能正確編譯。我已經將它包含在JAR清單的類路徑中。一旦運行它吐出堆棧跟蹤讓我知道它找不到主要類。ClassNotFoundException:通過ANT構建JAR文件中的主類

堆棧跟蹤如下:

 [java] java.lang.NoClassDefFoundError: $edu/gatech/oad/antlab/pkg1/AntLabMain 
    [java] Caused by: java.lang.ClassNotFoundException: $edu.gatech.oad.antlab.pkg1.AntLabMain 
    [java] at java.net.URLClassLoader$1.run(Unknown Source) 
    [java] at java.security.AccessController.doPrivileged(Native Method) 
    [java] at java.net.URLClassLoader.findClass(Unknown Source) 
    [java] at java.lang.ClassLoader.loadClass(Unknown Source) 
    [java] at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source) 
    [java] at java.lang.ClassLoader.loadClass(Unknown Source) 
    [java] Could not find the main class: $edu.gatech.oad.antlab.pkg1.AntLabMain. Program will exit. 
    [java] Exception in thread "main" 
    [java] Java Result: 1 

但是當我檢查下\ edu的jar文件\ gatech \ OAD \ antlab \ pkg1在AntLabMain.class是存在的。奇怪。

我將在下面包含XML源代碼,說實話,我不確定是什麼導致了這個問題。我最好的猜測是它的JAR文件的方式有問題,但我已經看了好幾個小時,看不到盡頭。

<project name="My Buildfile" default="all" basedir="."> 
<target name="init" depends="prepare" description="Initialize and set up properties"> 
    <property name="src.dir" location="./src/" /> 
    <property name="build.dir" location="build" /> 
    <property name="library.dir" location="lib" /> 
    <property name="apidoc.dir" location="apidoc" /> 
</target> 

<target name="prepare" description="Making required directories"> 
    <mkdir dir="build" /> 
    <mkdir dir="apidoc" /> 
</target> 

<target name="compile" depends="init" description="Compiling necessary files"> 
    <javac destdir="${build.dir}" includeantruntime="first"> 
     <src path="${src.dir}" /> 
     <classpath> 
      <pathelement path="${build.dir}" /> 
      <fileset dir="${library.dir}" includes="**/*.jar" /> 
     </classpath> 
    </javac> 
</target> 

<target name="javadoc" depends="init" description="Generating useful javadocs"> 
    <javadoc sourcepath="${src.dir}" access="public" destdir="${apidoc.dir}"> 
     <fileset dir="${src.dir}"> 
      <include name="**/*.java" /> 
     </fileset> 
     <classpath> 
      <fileset dir="${library.dir}" includes="**/*.jar" /> 
     </classpath> 
    </javadoc> 
</target> 

<target name="jar" depends="compile" description="JARing files for distribution"> 
    <jar destfile="${build.dir}/AntLabRun_Test.jar" basedir="${build.dir}" excludes="**/*.jar"> 
     <manifest> 
      <attribute name="Main-Class" value="edu.gatech.oad.antlab.pkg1.AntLabMain" /> 
      <attribute name="Class-Path" value="${library.dir}\resources.jar" /> 
     </manifest> 
    </jar> 
</target> 

<target name="run" depends="jar" description="Now running the program"> 
    <java jar="${build.dir}/AntLabRun_Test.jar" fork="true"> 
     <classpath> 
      <fileset dir="${library.dir}" includes="**/*.jar" />   
     </classpath> 
    </java> 
</target> 

<target name="all" depends="run" description="Doing EVERYTHING!"> 
</target> 

<target name="clean" depends="init" description="Cleaning Directories"> 
    <delete dir="${build.dir}" /> 
    <delete dir="${apidoc.dir}" /> 
</target> 

最後,我將包括獲取與JAR

這是我的Ant構建文件首次嘗試拉上清單,所以我不能很好地在他們熟悉。希望我已經提供了足夠的信息來讓球滾動。

Manifest-Version: 1.0 
Ant-Version: Apache Ant 1.8.2 
Created-By: 1.6.0_21-b07 (Sun Microsystems Inc.) 
Main-Class: edu.gatech.oad.antlab.pkg1.AntLabMain 
Class-Path: C:\Users\Mike Sandt\workspace\M4\lib/resources.jar 
+0

你的AntLabMain包含一個public static void main(String [] args)方法嗎? – mazaneicha

+0

是的,AntLabMain.java包含一個主要方法。它什麼都沒做,只是打印出一大堆文字,表示我們已經完成了作業。但是,它依賴於resources.jar,我將它包含在classpath中。 – msandt3

回答

1

原來答案很簡單。我需要編輯我的init目標以將屬性設置爲值而不是位置。

<target name="init" depends="prepare" description="Initialize and set up properties"> 
    <property name="src.dir" location="./src/" /> 
    <property name="build.dir" value="build" /> 
    <property name="library.dir" value="lib" /> 
    <property name="apidoc.dir" value="apidoc" /> 
</target> 

謝謝大家的響應。

1

看你的清單文件,看來該Main-Class屬性在類名的前面額外的$。嘗試刪除它,重新編譯該jar,然後再次執行它。

此外,如果您正在運行在其他計算機上這個罐子計劃,你可能會考慮改變你的清單文件中Class-Path屬性爲相對路徑..

+0

我編輯了我的Main-Class屬性中的錯誤,但它仍然給我相同的錯誤消息。你能詳細說明你的意思嗎?將類路徑屬性設置爲相對路徑? – msandt3

+0

目前,您的類路徑是絕對路徑。如果你想在另一臺沒有resources.jar的計算機上運行這個jar,那麼你會得到一個錯誤信息(雖然關於從resources.jar中丟失了一些類的錯誤)。 –

+0

另外,你應該會得到一個稍微不同的錯誤。你確定你清理並重新編譯了jar嗎? –

0

作爲最後的手段,你可以在提取resources.jar你的構建文件夾(而不是將其包含在類路徑中)並再次生成你的jar文件(從其中包含的resources.jar中提取文件)。

0

其他人已經指出類名的$問題。

問題,您的AntLabMain類是否有加載類時運行的任何靜態初始化器?如果是這樣,並且如果其中一個初始化器失敗,那麼JVM將報告找不到AntLabMain類,因爲它未能加載它。這真的是錯誤的錯誤,但你會看到。

因此,如果您在類中有靜態初始化,請檢查以確保所有工作都正常。

+0

AntLabMain會初始化多個對象,其中一個包含在resources.jar文件中,而不是直接編譯到jar中。問題是在運行時JVM無法找到resources.jar文件? – msandt3