2016-03-25 12 views
0

Hier ist eine sehr vereinfachte Version von dem, was ich versuche zu erreichen. Ich habe zwei Verzeichnisse, Directory1 und Directory2. Beide Verzeichnisse enthalten Java-Quelldateien. Einige der Dateien in Directory2 können denselben vollqualifizierten Klassennamen wie die Dateien in Directory1 haben.Wie erzwinge ant javac Aufgabe, um die Klassendatei im Zielverzeichnis zu überschreiben?

Mit ant werden die Dateien in ein Verzeichnis namens CompileDirectory, zuerst aus Directory1 und dann von Directory2 kompiliert. Ich möchte die Dateien in Directory2 kompiliert werden und überschreiben die kompilierten Klassendateien von Directory1. Ameise scheint jedoch die Klassen zu ignorieren, die denselben vollqualifizierten Klassennamen haben.

Hier ist ein einfaches Beispiel -

Verzeichnisstruktur

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

$ 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 

Wie man sehen kann, die javac2 Ziel oben tut nichts.

Wenn ich das Java-Programm ausführen, sehe ich, dass die Klassendatei die von Directory1 ist.

$ cd CompileDirectory/ 
$ java A 
I am class A from directory 1 

Gibt es eine Möglichkeit, die javac Aufgabe in dem javac2 Ziel zu zwingen, die Quelldatei in Directory2 und überschreibt die Klassendatei im CompileDirectory zu kompilieren?

Antwort

3

Es hat mit Timestamp von Dateien zu tun und ob der Compiler denkt, dass die Quelle neuer als die Klassendatei ist.

<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

Andere mögliche Weg, dies zu vermeiden, ist eine Bühne Verzeichnis erstellen und die Klassen dort kompilieren und überschreiben Option ursprünglichen Verzeichnis mit zurückkopieren.

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