2016-03-25 20 views
0

İşte, elde etmeye çalıştığım şeyin çok basitleştirilmiş bir sürümüdür. İki dizinim var, Directory1 ve Directory2. Her iki dizin de Java kaynak dosyaları içerir. Directory2'daki bazı dosyalar, Directory1'daki dosyalarla tam olarak aynı sınıf adına sahip olabilir.Ant javac görevini, hedef dizinde sınıf dosyasının üzerine yazmak için nasıl zorlanır?

Karınca kullanarak dosyalar, Directory1'dan itibaren Directory2'dan itibaren CompileDirectory adlı bir dizine derlenir. Directory2'daki dosyaların derlenmesini ve derlenmiş sınıf dosyalarının üzerine Directory1'dan yazılmasını istiyorum. Bununla birlikte, karınca, tamamen aynı sınıf ismine sahip sınıfları görmezden gelir.

Dizin yapısı

$ 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 çalıştırmak

$ 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 

görülebileceği gibi, javac2 - İşte

basit bir örnek Yukarıdaki hedef hiçbir şey yapmaz.

Java programını çalıştırdığımda, sınıf dosyasının Directory1'den olduğunu görüyorum.

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

CompileDirectory sınıf dosyası Directory2 kaynak dosyayı derlemek ve üzerine yazmak javac2 hedef javac görevi zorlamak için bir yolu var mı?

cevap

3

Bu, dosyaların zaman damgasıyla ve derleyicinin kaynağın sınıf dosyasından daha yeni olduğunu düşünerek yapması gerekir. Bunu önlemek için

<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

Diğer olası yolu bir sahne dizini oluşturmak ve orada sınıfları derlemek ve üzerine yazma seçeneğini kullanarak orijinal dizinine geri kopyalamak olacak.

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