2013-02-04 21 views
1

當包含在classpath任務中的文件不存在時,是否有內置的方式讓Ant拋出錯誤?我的目標是Ant在編譯目標被調用但是所需的庫不存在時拋出構建錯誤。如何讓Ant在類路徑任務中包含的文件不存在時拋出錯誤?

下面是包含依賴庫的build.xml文件的一個示例,但是當其中一個庫不存在時它不會引發錯誤。

<target name="compile" description="Compiles the Java code" depends="init"> 
    <mkdir dir ="${build}/${module-package}" /> 
    <javac srcdir="${src}/main/${module-package}" 
      destdir="${build}" 
      includeantruntime="off" 
      debug="true" 
      fork="true"> 

     <classpath> 
      <fileset dir="${lib}" > 
       <include name="joda-time/joda-time-2.1.jar" /> 
       <include name="jackson/jackson-core-lgpl-1.9.7.jar"/> 
       <include name="jackson/jackson-mapper-lgpl-1.9.7.jar"/> 
      </fileset> 
     </classpath> 
    </javac> 
</target> 
+0

如果編譯需要的庫不存在,那麼'javac'任務本身是否會失敗呢?而且,如果構建不失敗,庫不是必需的。 'javac'沒有提供一個函數來確保類路徑中的文件存在與否;但是,您可以將'fileset'放在外面,使用'condition'和'fail'任務執行檢查並使構建失敗,然後調用'javac'。 – coolcfan

+0

是的,javac任務會失敗,但不知道哪個庫丟失。我希望有一個更好的方法來實現這一點,而不是使用條件和失敗 – Thomas

回答

1

您可以使用available任務ANT檢查階級的存在,你知道應該存在(由罐提供)。

<path id="compile.path"> 
    <fileset dir="${lib}" > 
     <include name="joda-time/joda-time-2.1.jar" /> 
     <include name="jackson/jackson-core-lgpl-1.9.7.jar"/> 
     <include name="jackson/jackson-mapper-lgpl-1.9.7.jar"/> 
    </fileset> 
</path> 

<available classname="org.joda.time.DateTime" property="joda.present" classpathref="compile.path"/> 
<available classname="org.codehaus.jackson.JsonFactory" property="jackson.present" classpathref="compile.path"/> 

<target name="compile" description="Compiles the Java code" depends="init"> 
    <mkdir dir ="${build}/${module-package}" /> 

    <fail message="Joda time missing" unless="joda.present"/> 
    <fail message="Jackson missing" unless="jackson.present"/> 

    <javac srcdir="${src}/main/${module-package}" 
      destdir="${build}" 
      includeantruntime="off" 
      debug="true" 
      fork="true" 
      classpathref="compile.path" 
      /> 
</target> 
+0

有沒有一種方法來使用這種方法,以便錯誤顯示哪個jar特別缺少,而不必在'available'任務中重複jar文件名? – Thomas

+0

@ThomasRyabin不是我所知道的。考慮到理論上同一個類可以打包在classpath上的多個jar文件中,這將是一個棘手的特性。就我個人而言,我使用Apache ivy解決了這個類路徑管理問題,並從Maven存儲庫中提取了所有的依賴關係。 –

+0

謝謝@ MarkO'Connor,這是一個很棒的解決方案,對我來說也有幫助。我們通常使用gradle,但是在我交付的傳統項目中,它使用的是ant。它缺少一個庫,並且不明確它來自哪個內部項目。我現在已經更新了Ant build.xml,以使事情更加明顯,缺少什麼,以及將來從哪個項目獲取lib。但是,我想我會嘗試轉換爲Maven以便自動解決依賴關係,然後在我們的git倉庫中擁有這個lib – wired00

相關問題