2014-03-24 50 views
0

我是新來的apache ant,我目前正在開發一個apache Ant項目。我剛開始,將該項目導入到工作區並嘗試運行build.xml。我將原始項目附帶的所有庫添加到構建路徑中。我有以下問題。請別人寫代碼,我應該改進它。這是全部的目錄存在於項目目錄中。Apache Ant {Compile javac srcdir}不存在

BUILD FAILED 
C:\workspace\MyApp\build.xml:83: srcdir "C:\workspace\MyApp\${compile.javac.srcdir}"  does not exist! 

錯誤代碼引用的build.xml文件

<target name="compile.default" depends="init"> 
    <javac fork="yes" srcdir="${compile.javac.srcdir}" destdir="${compile.javac.destdir}" includes="${compile.javac.include}" excludes="${compile.javac.exclude}" classpath="${compile.javac.classpath}" debug="${compile.javac.debug}" optimize="${compile.javac.optimize}" deprecation="${compile.javac.deprecation}" verbose="${compile.javac.verbose}"> 
    </javac> 
    <copy todir="${compile.javac.destdir}"> 
     <fileset dir="${compile.javac.srcdir}" includes="${compile.copy.include}" excludes="${compile.copy.exclude}"/> 
    </copy> 
</target> 
<target name="compile" depends="init,compile.default" description="Compile all java source"> 
</target> 
<!--+++++++++++++++--> 
<!-- lib target(s) --> 
<!--+++++++++++++++--> 
<target name="lib.default" depends="init,compile"> 

    <xmlbean schema="config/schemas/validate/1.0/validate.xsd" destfile="lib/glx-beans.jar" classpath="lib/xbean.jar:lib/jsr173_1.0_api.jar" /> 

    <jar jarfile="${lib.filename}"> 
     <fileset dir="${lib.srcdir}" excludes="${lib.exclude}" /> 
    </jar> 



</target> 

<target name="lib" depends="init,compile,lib.default" description="Create all Project Libraries"> 
</target> 

請你告訴我,我錯過了什麼下面的部分?

+0

其中'$ {compile.javac.srcdir}'定義了嗎?一些財產可能是! – AKS

回答

2

${compile.javac.srcdir}未定義。有幾種可能性:

  • 這不是在build.xml中定義的,而是在某種屬性文件中定義的。看看你的構建腳本中是否有類似<property file="..."/>的東西。我的建議是在build.xml文件中定義所有屬性,並使用屬性文件來覆蓋這些設置。這樣,開發人員在build.xml文件中需要的唯一構建文件,並且不必擔心設置單獨的build.porperties文件。
  • 這是在特定任務下的build.xml文件中定義的,但您忘記說您使用此目標的目標取決於此任務。

您可以做的一件事是在運行Ant時使用-d參數。

$ and -d 2>&1 | tee ant.out 

我可以再看看ant.out,看看不知何故,我沒有定義特定屬性:我與-d參數在運行Ant時運行以下命令。也許我的大寫字母是錯誤的或拼錯了屬性名稱。例如,我很可能會將該屬性定義爲copmile.javac.srcdir,因爲我不知道如何拼寫。看着-d輸出可以快速指出這些類型的錯誤。

順便說一句,你不應該有你所有的任務取決於init因爲他們在compile.default是依賴反正:

<target name="compile.default" depends="init"> 
    .... 
</target> 
<target name="compile" depends="compile.default"> 
    .... 
</target> 
<target name="lib" depends="compile,lib.default"> 
    .... 
</target> 

如果我運行目標lib,它會看到compile取決於compile.default,這取決於init。因此,您的版本將運行init,然後運行compile.default,然後運行compile,然後運行'lib.default and finally lib`。

如果init任務正在設置屬性,則可以在任何任務外執行此操作。然後,這些屬性將在任何任務執行之前設置。這樣,他們不會被遺忘。如果您的init也正在創建目錄,則可能需要將這些<mkdir/>任務移動到使用該目錄的任務前面。例如,您可能希望在<javac/>任務之前使javac中的destdir使用

我發現在任何任務外分配默認屬性,並在需要它們以創建目錄之前簡化build.xml。另外,如果用戶僅僅編譯並且不打包jar/war/etc,那麼您不會創建整個未使用的目錄。

+0

Hey @David,我可以在build.xml中看到以下''以及三個不同的物理屬性文件(一個用於DEV,一個用於PROD和另一個測試)我在DEV中,我如何鏈接屬性到DEV屬性文件? – Yandroide

+0

您需要將屬性'target.env'設置爲正確的屬性。試試'$ ant -Dtarget.env =「dev」'。確保外殼與文件名相同。我建議你添加''來假定你正在使用DEV環境,除非你在命令行上另外指定。您可以隨時重寫它,但如果開發人員忘記設置屬性,則構建不會失敗。 –