![](/img/trans.png)
[英]How to specify directory or file glob as javac classpath value with Apache Ant?
[英]How to force ant javac task to overwrite the class file in the destination directory?
這是我要達到的目標的非常簡化的版本。 我有兩個目錄, Directory1
和Directory2
。 這兩個目錄都包含Java源文件。 一些文件Directory2
可以有相同的完全合格的類名稱,如文件Directory1
。
使用ant,首先從Directory1
然后從Directory2
將文件編譯到名為CompileDirectory
Directory2
。 我想在文件Directory2
進行編譯和覆蓋編譯的類文件Directory1
。 但是,ant似乎忽略了具有相同完全限定類名的類。
這是一個簡單的例子-
目錄結構
$ ls -R
.:
build.xml CompileDirectory Directory1 Directory2
./CompileDirectory:
./Directory1:
A.java
./Directory2:
A.java
build.xml
<project name="TestProject" default="build" basedir=".">
<target name="build" depends="javac1, javac2" />
<target name="javac1">
<javac srcdir="${basedir}/Directory1" destdir="CompileDirectory" includeantruntime="false"/>
</target>
<target name="javac2">
<javac srcdir="${basedir}/Directory2" destdir="CompileDirectory" includeantruntime="false"/>
</target>
</project>
螞蟻跑
$ ant -buildfile build.xml
Buildfile: ...(path).../build.xml
javac1:
[javac] Compiling 1 source file to ...(path).../CompileDirectory
javac2:
build:
BUILD SUCCESSFUL
Total time: 0 seconds
可以看出,上面的javac2
目標什么都不做。
運行Java程序時,我看到該類文件是Directory1中的文件。
$ cd CompileDirectory/
$ java A
I am class A from directory 1
有沒有一種方法可以強制javac2
目標中的javac
任務編譯Directory2
的源文件並覆蓋CompileDirectory
的類文件?
它與文件的時間戳以及編譯器是否認為源比類文件更新有關。
<project name="TestProject" default="build" basedir=".">
<target name="build" depends="javac1, touch2, javac2" />
<target name="javac1">
<javac srcdir="${basedir}/Directory1" destdir="CompileDirectory" includeantruntime="false"/>
</target>
<target name="touch2">
<sleep seconds="2" />
<touch datetime="now">
<fileset dir="${basedir}/Directory2" />
</touch>
</target>
<target name="javac2">
<javac srcdir="${basedir}/Directory2" destdir="CompileDirectory" includeantruntime="false"/>
</target>
</project>
避免這種情況的其他可能方法是創建一個stage目錄並在那里編譯類,然后使用overwrite選項將其復制回到原始目錄。
<project name="TestProject" default="build" basedir=".">
<target name="build" depends="javac1, javac2, copy1" />
<target name="javac1">
<javac srcdir="${basedir}/Directory1" destdir="CompileDirectory" includeantruntime="false"/>
</target>
<target name="javac2">
<javac srcdir="${basedir}/Directory2" destdir="CompileDirectory1" includeantruntime="false"/>
</target>
<target name="copy1">
<copy overwrite="on" todir="CompileDirectory">
<fileset dir="CompileDirectory1">
<include name ="**/*.*"/>
</fileset>
</copy>
</target>
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.