2016-03-25 16 views
0

ここでは、私が達成しようとしているものの非常に単純化されたバージョンです。私は2つのディレクトリ、Directory1Directory2を持っています。どちらのディレクトリにもJavaソースファイルが含まれています。 Directory2の一部のファイルは、Directory1のファイルと完全に同じクラス名を持つことができます。ant javacタスクが強制的に宛先ディレクトリのクラスファイルを上書きする方法はありますか?

antを使用すると、ファイルはDirectory1からDirectory2から最初にCompileDirectoryというディレクトリにコンパイルされます。 のファイルをコンパイルして、コンパイルしたクラスファイルを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の実行

$ 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 

CompileDirectoryでクラスファイルをDirectory2でソースファイルをコンパイルし、上書きするjavac2ターゲットにjavacタスクを強制する方法はありますか?

答えて

3

ファイルのタイムスタンプや、ソースがクラスファイルより新しいとコンパイラが判断するかどうかが関係します。

<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> 
0

これを避ける他の方法として、ステージディレクトリを作成してクラスをコンパイルし、上書きオプションを使用して元のディレクトリにコピーする方法があります。

<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> 

関連する問題