2009-04-14 12 views
2

Wir haben eine Reihe von Ant-Skripten, eines für jedes unserer Teilprojekte. Am Ende möchten wir alle diese von einem Master-Build-Skript ausführen und eine andere Hausreinigung durchführen, um das gesamte Projekt zu paketieren. Jedes einzelne Ant-Skript heißt ant.xml und befindet sich im Unterverzeichnis seines Projekts. Jeder verwendet eine Ant import, um eine ant-commons.xml zu importieren, und überschreibt dann einige der spezifischen Ziele dort.Warum funktioniert meine Ant-Master-Build-Datei nicht ordnungsgemäß?

Zum Beispiel eines der Projekte überschreibt das compile Ziel, die classpath entsprechend eingestellt wird, und die source und target-1,5 einzustellen (die Ameise-Commons nutzt 1.4)

Jetzt, in der Theorie, das alles klingt einfach. Hier ist der Master Build-Skript:

<project name="Retain" basedir="." default="main"> 
    <target name="main"> 
    <ant dir="SharedJava" antfile="ant.xml" target="clean"/> 
    <ant dir="SharedJava" antfile="ant.xml" target="copy_current"/> 
    <ant dir="GWEasySoap" antfile="ant.xml" target="clean"/> 
    <ant dir="GWEasySoap" antfile="ant.xml" target="copy_current"/> 
    <ant dir="RetainLib" antfile="ant.xml" target="clean"/> 
    <ant dir="RetainLib" antfile="ant.xml" inheritAll="false" target="copy_current"/> 
    <ant dir="RetainIndex" antfile="ant.xml" target="clean"/> 
    <ant dir="RetainIndex" antfile="ant.xml" target="copy_current"/> 
    <ant dir="RetainPersist" antfile="ant.xml" target="clean"/> 
    <ant dir="RetainPersist" antfile="ant.xml" target="copy_current"/> 
    </target> 
</project> 

Was tatsächlich passiert:

Die ersten Teilprojekte gut laufen. RetainLib, die in der Tat einen Verweis auf die SharedJava 's Glas haben muss, dann scheitert, jammern darüber, wie es nicht finden kann. Als ich RetainLib, RetainIndex löste, scheiterte, wie man Generika in einer 1.4 Zieldatei nicht verwenden sollte.

Nachdem ich herumgespielt habe, habe ich ganz einfach festgestellt, dass diese darauf bestanden, das kompilierte Ziel innerhalb von ant-commons anstelle des überschriebenen zu laufen.

Warum? Wie kann ich das umgehen? (Elegant, ich meine - offensichtlich konnte ich die Verwendung von Ant-Commons insgesamt entfernen und ich wette Dinge würden funktionieren.)

Antwort

1

Ich würde vorschlagen, die inheritAll = "false" Attribut auf den Aufgaben. Das Problem, das Sie sehen, hängt mit der Tatsache zusammen, dass die basedir-Eigenschaft und andere Eigenschaften der Masterdatei Probleme mit den relativen Pfaden der Teilprojekte verursachen.

Ich würde auch verlieren dir = ".." Attribut, um sicherzustellen, dass das Unterprojekt basedirs gewinnen.

Also das ist, was ich tun würde ...

<project name="Retain" basedir="." default="main"> 
    <target name="main"> 
    <ant antfile="SharedJava/ant.xml" target="clean" inheritAll="false"/> 
    <ant antfile="SharedJava/ant.xml" target="copy_current" inheritAll="false"/> 
    <ant antfile="GWEasySoap/ant.xml" target="clean" inheritAll="false"/> 
    <ant antfile="GWEasySoap/ant.xml" target="copy_current" inheritAll="false"/> 
    ... 
    </target> 
</project> 
+0

Nein. Es tut uns leid. Dein Rat ist genau falsch, zumindest vom Ergebnis. 1. Mit dir removed und inheritFalse schlägt der Build sofort fehl, da das aufgerufene ant.xml-Skript jetzt in seinem Verzeichnis verwechselt wird. 2.Mit dir wiederhergestellt zu seinem glorreichen und rechtmäßigen Platz :) und inheritFalse, scheitert der Build, genau wie beschrieben. –

0

Alle Anrufe eröffnet eine neue Ameise Instanz. Selbst wenn "SharedJava" einige Überschreibungen in ant-commons.xml ausführt, sehen die anderen Skripte es nicht. Sie könnten versuchen, ant-commons.xml in das Basisskript einzubeziehen und die Werte in den Unterdateien zu verwenden, da einige vererbt werden. Für nicht-vererbbare Werte, wie Pfade können Sie so etwas wie benannte Parameter verwenden:

<ant antfile="${check.build.file}" target="validateXml"> 
    <property name="p.check_dir" location="${project.base.dir}" /> 
    <property name="p.dtd_dir" location="${build.data.dir}" /> 
</ant> 

ich wähle keine Abhängigkeiten in Aufgaben von externen Scripts zu haben, aber die als Parameter auf ihre Anrufe ausgedrückt diejenigen.

1

Ich habe an einem ähnlichen Projekt gearbeitet und was gemacht wurde, war ein Build-Verzeichnis, wo die Ausgabe aller Ameisen-Aufgaben platziert wurde, es hat gut funktioniert. Ohne zusätzliche Informationen darüber, was in den Builddateien vor sich geht, wird es schwierig sein, zusätzliche Erkenntnisse zu liefern.

Verwandte Themen