我正在用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>
感謝您的快速回復,現在這對我的作品。我將稍後發佈完整的解決方案。 – mkm13