2013-06-26 59 views
1

我正在用Ant構建項目,並希望在源發生更改時導致重新編譯。除了以下情況之外,它大多可以自動執行標準的javac任務:當文件被刪除時ant重建

當源文件被刪除但沒有其他更改時,沒有任何重新編譯。

即使這會使項目無法在沒有錯誤的情況下乾淨地編譯,由於剩餘的類文件,構建仍然會成功。

每次都做一個乾淨的構建不是一個選項,因爲我們有137個依賴模塊需要很長時間才能構建。另外,我們不希望在全面清理後重試每個失敗的CI構建,以確定它是否能夠正常工作。

這似乎是一個非常基本的東西,應該由javac任務支持,但我沒有看到任何看起來有用的屬性。我不能讓它嘗試別的之後我能想到的:

找出是否有任何遺留的類:

<difference id="targets.todelete"> 
    <union> 
    <mappedresources> 
     <fileset dir="${src.java.dir}" includes="**/*.java" /> 
     <globmapper from="*.java" to="*.class" /> 
    </mappedresources> 
    </union> 
    <union> 
    <fileset dir="${build.java.dir}" includes="**/*.class" /> 
    </union> 
</difference> 

以上不工作,區別實際上似乎更像一個工會。如果一個java文件有一個對應的類文件,那麼差異中將有兩個類文件的條目。

這又是一次嘗試:

<fileset id="del" dir="${src.java.dir}" includes="**/*.java" casesensitive="false" defaultexcludes="false"> 
    <different targetdir="${build.java.dir}" ignoreFileTimes="true"> 
    <globmapper from="*.java" to="*.class" /> 
    </different> 
</fileset> 

我試圖發現,是不同的所有文件,但結果卻或多或少與上面相同。

當我嘗試沒有使用映射器時,在和中使用部分重疊的源文件集,它確實按預期工作。這導致我懷疑與資源差異有關的任何事情都不能很好地與映射文件一起玩。

有沒有人在這裏有任何想法如何以任何其他方式實現我的目標?

更新: 這是正確處理內部類的工作解決方案。 我需要多個源目錄,這會使事情進一步複雜化。

<!-- find class files with without corresponding source files --> 
<fileset id="src1" dir="${src.java.dir}" includes="**/*.java" /> 
<fileset id="src2" dir="${build.generated.java.dir}" includes="**/*.java" erroronmissingdir="no" /> 
<fileset id="src3" dir="${generated.java.dir}" includes="**/*.java" erroronmissingdir="no" /> 

<fileset id="build" dir="${build.java.dir}" includes="**/*.class" erroronmissingdir="no" /> 
<difference id="targets.todelete"> 
    <resourcelist> 
    <string>${toString:src1};${toString:src2};${toString:src3}</string> 
    <filterchain> 
     <tokenfilter> 
     <replacestring from=";" to="${line.separator}" /> 
     <replacestring from=".java" to=".class" /> 
     </tokenfilter> 
     <ignoreblank/> 
     <prefixlines prefix="${build.java.dir}/" /> 
    </filterchain> 
    </resourcelist> 
    <resourcelist> 
    <string>${toString:build}</string> 
    <filterchain> 
     <tokenfilter> 
     <replacestring from=";" to="${line.separator}" /> 
     <!-- map inner classes back to their java files --> 
     <replaceregex pattern="\$.*(.class)" replace="\1" flags="gi"/> 
     </tokenfilter> 
     <prefixlines prefix="${build.java.dir}/" /> 
    </filterchain> 
    </resourcelist> 
</difference> 

<if> 
    <not> 
    <length string="${toString:targets.todelete}" trim="true" length="0" /> 
    </not> 
    <then> 
    <echo>Source files were deleted, cleaning output to force re-build!</echo> 
    <delete dir="${build.java.dir}" /> 
    <delete dir="${build.test.java.dir}" /> 
    <delete dir="${cobertura_html_report.dir}" /> 
    </then> 
</if> 

回答

1

的問題是,difference資源集合確實根據的絕對路徑,而不是相對路徑的差異。而且沒有辦法讓Ant將映射器應用到完整的絕對路徑。它只是與資源名稱一起工作。

解決方案是將文件集序列化爲字符串列表,對該字符串列表進行適當更改,並將它們解釋爲差異文件。

這裏建議件的build.xml應該計算類文件的正確列表:

<fileset id="src" dir="${src.java.dir}" includes="**/*.java"/> 

<fileset id="build" dir="${build.java.dir}" includes="**/*.class"/> 

<difference id="targets.todelete"> 
    <resourcelist> 
     <string>${toString:src}</string> 
     <filterchain> 
      <tokenfilter> 
       <replacestring from=";" to="${line.separator}" /> 
       <replacestring from=".java" to=".class" /> 
      </tokenfilter> 
      <prefixlines prefix="${build.java.dir}" /> 
     </filterchain> 
    </resourcelist> 
    <resourcelist> 
     <string>${toString:build}</string> 
     <filterchain> 
      <tokenfilter> 
       <replacestring from=";" to="${line.separator}" /> 
      </tokenfilter> 
      <prefixlines prefix="${build.java.dir}" /> 
     </filterchain> 
    </resourcelist> 
</difference> 
+0

感謝您的快速回復,現在這對我的作品。我將稍後發佈完整的解決方案。 – mkm13

相關問題