2009-12-28 5 views
6

Ich muss einige ant-Befehle abhängig von einer Umgebungsvariablen ausführen, die als Parameter an den maven build-Befehl übergeben wird.Wie man Aufgaben mit dem maven-antrun-plugin bedingt ausführt?

Im Moment habe ich 3 Aufgabenblöcke und nur der Aufgabenblock ohne Bedingung wird ausgeführt.

<tasks name="isProdCheck"> 
    <condition property="isProd"> 
    <equals arg1="${environment}" arg2="PROD" /> 
    </condition> 
</tasks> 

<tasks if="isProd" depends="isProdCheck"> 
... 
</tasks> 

<tasks> 
... I am the only block executed 
</tasks> 

Was mache ich falsch, gibt es einen besseren Weg, dies zu tun?

+0

Kann yo Sie bestätigen einfach, wie Sie Maven aufrufen und den Parameter übergeben? –

+0

Sehe ich es richtig, dass Ihre 2. Aufgabe keinen Namen hat? –

Antwort

9

Zuerst, laut Maven 1.x Website, ist die aktuelle stabile Version für Maven 1.x Version 1.1, nicht 1.4. Zweitens gibt es kein AntRun Plugin Version 1.7 und meines Wissens ist dies ein Maven 2 Plugin. Drittens scheint die Syntax, die Sie verwenden, sehr ähnlich zu Using Attributes, die wiederum über Maven 2 ist.

Also, ich vermisse etwas, aber das ist sehr verwirrend und Sie sollten vielleicht diese Punkte in Ihrer Frage klären.

Jedenfalls, wie Sie Maven 1 explizit erwähnt haben, werde ich versuchen zu antworten. Wenn ich mich gut erinnere, würde ich ein benutzerdefiniertes Ziel schreiben und Jellys core:if oder core:when verwenden. so etwas tun, bieten in maven.xml:

<project xmlns:j="jelly:core" xmlns:ant="jelly:ant"> 
    <goal name="my-goal"> 
    <j:if test="${environment == 'PROD'}"> 
     <ant:xxx .../> 
    </j:if> 
    </goal> 
</project> 

Ich bin wirklich nicht sicher, ob die Syntax, das alles Maven 1 Sachen weg einfach zu weit sind, und ich habe es nicht getestet (ich bin zu faul, Maven zu installieren 1). Aber ich denke du wirst es tun. Die scripting reference kann Ihnen helfen.

ehrlich zu sein, ich hoffe, dass Sie wirklich einen guten Grund zu bevorzugen Maven 1.x über Maven 2.x haben :)

UPDATE: Es scheint, dass die OP Maven 2 unter Verwendung von tatsächlich so ich werde meine Frage entsprechend aktualisieren. Um das gewünschte Verhalten zu implementieren, können Sie Ant-contrib der Verwendung if Aufgabe wie folgt:

<build> 
    <plugins> 
     <plugin> 
     <artifactId>maven-antrun-plugin</artifactId> 
     <version>1.3</version> 
     <executions> 
      <execution> 
      <phase>compile</phase> 
      <goals> 
       <goal>run</goal> 
      </goals> 
      <configuration> 
       <tasks> 
       <taskdef resource="net/sf/antcontrib/antcontrib.properties" 
        classpathref="maven.plugin.classpath" /> 
       <if> 
        <equals arg1="${foo}" arg2="bar" /> 
        <then> 
        <echo message="The value of property foo is bar" /> 
        </then> 
        <else> 
        <echo message="The value of property foo is not bar" /> 
        </else> 
       </if> 
       </tasks> 
      </configuration> 
      </execution> 
     </executions> 
     <dependencies> 
      <dependency> 
      <groupId>ant-contrib</groupId> 
      <artifactId>ant-contrib</artifactId> 
      <version>20020829</version> 
      </dependency> 
     </dependencies> 
     </plugin> 
    </plugins> 
    </build> 

Und dann rufen mvn compile -Dfoo=bar (dies ist nur ein Beispiel).

Aber das ist nicht der "maven way", Dinge zu tun. Jetzt, wo ich ein bisschen besser verstehe, was du versuchst zu tun (aber nicht ganz, weil du dein ultimatives Ziel nicht erklärst), denke ich, dass die Verwendung von build profiles angemessener wäre und, nachdem du deine eigene Antwort gelesen hast, denke ich, dass du es bist über Komplikationen (und dass Sie auf dem falschen Weg sind).

Ich verstehe, dass Sie ein Maven Anfänger sind, aber ich würde vorschlagen, es zu verwenden, obwohl anstatt auf Ant zurückzugreifen, oder Sie nicht die Vorteile davon bekommen werden. Auch wenn Sie eine Frage öffnen, anstatt nach einer spezifischen Lösung zu fragen, sollten Sie eher Ihr allgemeines Problem erklären, damit Sie bessere Antworten erhalten. Hier kann ich keine weitere Anleitung geben, da ich nicht weiß, was Sie wirklich erreichen wollen.

+0

Entschuldigung, ziemlich neu für Maven. Ich benutze Maven 2.0.9 mit JDK 1.4. – vaughan

+0

Kein Problem, das macht mehr Sinn. Ich werde meine Antwort entsprechend aktualisieren. –

+0

Danke für Ihre Hilfe Pascal. Deine obige Lösung sieht genau so aus, wie ich es versucht habe zu erreichen. Ich konnte die 'if'-Anweisungen nicht ausführen, da ich nicht wusste, dass ich eine ant-contrib-Ressource hinzufügen musste. Im Wesentlichen versuche ich eine Verzeichnisstruktur auf einem Anwendungsserver zu erstellen, die davon abhängt, ob ich in einer Entwicklungs-/Testumgebung oder einer Produktionsumgebung bin. Ich habe mir nur kurz die Build-Profile angeschaut und es klingt, als wäre das eine bessere Art, Dinge zu tun. Vielen Dank! – vaughan

0

Dieses Problem wurde behoben, indem mehrere benannte Ziele mit "if" -Attributen und einer Bedingungseigenschaft in einer Datei build.xml im Projektstamm wie folgt erstellt wurden.

<target name="prod" if="isProd" depends="isProdCheck"> 
    // do something 
</target> 

Bestanden Eigenschaften der Befehlszeilenschalter I erforderlich ist, und die genannte ant Ziele in der build.xml Datei aus dem Tasks Abschnitt in der Maven POM wie folgt:

<tasks> 
<ant antfile="${basedir}/build.xml"> 
    <property name="environment" value="${environment}"/>   
    <target name="prod"/> 
</ant>   
</tasks> 
+0

Nichts für ungut, aber das ist eine schreckliche Möglichkeit, Maven zu benutzen, um dein Problem zu lösen. –

+0

Warum müssen Sie ein bestimmtes Ziel anrufen und dann prüfen, ob Sie das richtige Ziel aufgerufen haben? Können Sie nicht je nach Umgebung das richtige Ziel von Maven aufrufen (z. B. benannt nach den Umgebungsnamen)? –

4

Sie brauchen nicht zu verwenden AntContrib nach maven-antrun-plugin 1.5 die <target> statt <tasks> nach plugin usage verwendet. Dieses Tag funktioniert auf die gleiche Art und Weise, aber in diesem Fall können Sie Bedingungen wie das folgende Beispiel hinzufügen.

Der obige Code führt immer das erste Ziel aus, aber das zweite Ziel hängt von einem Eigenschaftswert ab. Sie können es auch für ein Eltern- und ein Untermodul-Projekt konfigurieren, indem Sie das Plugin unter <pluginsManagement> definieren und einige Eigenschaften der Untermodule aufrufen und dann das Plugin aufrufen.

+1

Danke. es funktioniert –

+0

Danke! "my-target" wird nur ausgeführt, wenn "execute.my.target" definiert ist und "true", "on" oder "yes" entspricht. – Sxilderik

+0

Funktioniert nicht in 1.8. Wenn ich zwei 'target' in' 'stecke, führt das Plugin nur den letzten aus (und Intellij IDEA markiert das letzte Ziel mit einem Fehler auf pom.xml). – Dherik

0

fahrbare Beispiel hier https://www.surasint.com/run-ant-with-if-from-maven/

Eine andere Lösung wäre: Halten Sie die Ameise-contrib-1.0b3.jar auf einen Pfad und dann definieren wie diese

<property name="runningLocation" location="" /> 
<taskdef resource="net/sf/antcontrib/antcontrib.properties"> 
    <classpath> 
     <pathelement location="${runningLocation}/ant-contrib-1.0b3.jar" /> 
    </classpath> 
</taskdef> 

dann

<target name="doSomething"> 
    <if> 
     <equals arg1="${someProp}" arg2="YES" /> 
     <then> 
      <echo message="It is YES" /> 
     </then> 
     <else> 
      <echo message="It is not YES" /> 
     </else> 
    </if> 
</target> 

Ich habe den vollständigen Code Beispiel hier, die Sie herunterladen können https://www.surasint.com/2017/04/09/run-ant-with-if-from-maven/