簡體   English   中英

如何強制ant javac任務覆蓋目標目錄中的類文件?

[英]How to force ant javac task to overwrite the class file in the destination directory?

這是我要達到的目標的非常簡化的版本。 我有兩個目錄, Directory1Directory2 這兩個目錄都包含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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM