2016-07-22 74 views
0

我想做一個無頭版本,需要日食特定的任務。螞蟻eclipse無頭版本 - java.lang.NoClassDefFoundError

爲了啓動ant buildfile,我使用下面的命令。我這樣做是因爲我相信它允許我運行以前抱怨他們需要工作空間運行的eclipse任務。如果這是不正確的/如果有更好的方法,請告訴我。

我的批處理腳本:

java -jar %EQUINOX_LAUNCHER_JAR% -application org.eclipse.ant.core.antRunner -buildfile %ANT_SCRIPT_JAR% -data %WORKSPACE_PATH% 

在我的Ant構建,我需要定義一個任務:

<taskdef name="myTask" classname="path.to.class.with.execute"><classpath><pathelement location="path\to\dependency.jar"/></classpath></taskdef> 

當運行

<myTask/> 

我得到

java.lang.NoClassDefFoundError: path/to/class/that/I/tried/to/import 
+0

唯一的可能性是一個路徑.jar錯誤,或者類名錯誤。是.jar路徑的相對路徑嗎?如果是這樣,它是相對於構建文件?你是否爲該項目指定了一個備用的basedir?你是否仔細檢查過.jar是否包含該類? – VGR

+0

所有路徑都是絕對路徑。糾正我,如果我錯了,但由於任務執行,但然後得到一個錯誤,我相信這意味着我的類名設置正確。我不相信我建立了一個備用主機 – David

+0

因此,NoClassDefFoundError是不是指任務類本身? – VGR

回答

1

您的任務代碼使用的類必須位於類路徑中。一種選擇是定義任務時,明確地將它們添加到類路徑:

<taskdef name="myTask" classname="path.to.class.with.execute"> 
    <classpath> 
     <pathelement location="path/to/dependency.jar"/> 
     <pathelement location="path/to/transitive-dependency.jar"/> 
     <pathelement location="path/to/other-transitive-dependency.jar"/> 
    </classpath> 
</taskdef> 

如果所有的.jar文件都在同一個目錄樹,就可以縮短到:

<taskdef name="myTask" classname="path.to.class.with.execute"> 
    <classpath> 
     <fileset dir="path/to/dir" includes="**/*.jar"/> 
    </classpath> 
</taskdef> 

另外一個可能性是將Class-Path屬性添加到包含任務類的.jar的清單中。該屬性的值是一個以空格分隔的相對URL列表,其隱含基礎是清單所在的.jar文件。例如:

Class-Path: transitive-dependency.jar utils/other-transitive-dependency.jar 

如果你正在構建的任務的.jar本身在Ant中,你可以在Ant的jar任務的類路徑屬性:

<jar destfile="task.jar"> 
    <fileset dir="classes"/> 
    <manifest> 
     <attribute name="Class-Path" 
      value="transitive-dependency.jar utils/other-transitive-dependency.jar"/> 
    </manifest> 
</jar>