2011-01-13 11 views
27

Ich muss den Maven-Build für ein großes Projekt ändern, um bestimmte Schritte während typischer Entwicklungs-Builds zu überspringen (d. H. Die * -source.jar-Dateien nicht erstellen). Ich habe nach "bedingter Ausführung" für Maven gesucht, aber nichts gefunden.Maven-Profile verwenden, um Build-Ausführung zu steuern

Ein Dev-Profil klingt wie die intuitive Art, dies zu tun - aber ich weiß nicht, wie intuitiv Maven ist. Die Dokumentation für Profile zeigt, wie verschiedene Eigenschaften (d. H. Datenbankverbindungsparameter) für verschiedene Profile festgelegt werden. Ich nehme an, ich könnte eine Eigenschaft festlegen und dann testen, ob diese Eigenschaft im Ausführungs-Tag maven-source-plugin - executions gesetzt ist.

Ist dies der richtige Weg, bedingte Ausführung in Maven zu tun?

Was ist der "richtige" Weg, dies in Maven zu tun?

Antwort

33

Sie denken darüber ein bisschen zurück: haben Sie das Profil aktivieren Sie das Verhalten, nicht deaktivieren Sie es. Dies ist genau das, was Profile am besten sind, und genau das ist Ihr Fall: Sie möchten nur, dass die Schritte unter bestimmten Umständen ausgeführt werden. So haben Sie vielleicht so etwas wie:

<profile> 
    <id>source-jars</id> 
    <build> 
    <plugins> 
     <plugin> 
     <groupId>org.apache.maven.plugins</groupId> 
     <artifactId>maven-source-plugin</artifactId> 
     ... 

Und in der Tat gibt es ein Beispiel, wie dies auf den maven-source-plugin usage page. Wenn Sie Ihr Artefakt generieren müssen, verwenden Sie mvn -P Quell-jars (oder was auch immer). Das ist es! Wenn Sie dies nur zur Release-Zeit tun müssen, bietet die release plugin sogar eine Möglichkeit, die zu verwendenden Profile direkt in der Release-Plugin-Konfiguration zu definieren.

+0

Unsere Poms werden geschrieben, wo maven-source-plugin standardmäßig läuft, also muss ich sie neu strukturieren, wie Sie es vorschlagen. –

+3

Es gibt viele Fälle, in denen Plug-ins standardmäßig aktiviert und durch Verwendung eines Profils deaktiviert werden sollen. Ich denke, diese Antwort vermeidet das Problem, ohne es zu lösen. – Kevin

+1

@Mowgli Aber das maven-Profilsystem ist dafür nicht gut geeignet: es gibt nur einen "Aktivierungs" -Mechanismus, keinen "Deaktivierungs" -Mechanismus. Einige Plugins verarbeiten dies, indem sie einen eigenen Deaktivierungsmechanismus erstellen (z. B. skipTests für das todsichere Plugin). –

6

Sie können Ihr tatsächliches Ziel erreichen, indem Sie standardmäßig das Plug-in "source-jars" aktivieren, indem Sie Ihrem POM zwei Profile hinzufügen. Die Maven profiles documentation stellt fest, dass Sie ein Element <activeByDefault>true</activeByDefault> zum activation Abschnitt hinzufügen und stellen fest, dass

Dieses Profil automatisch aktiv sein wird für alle Versionen, es sei denn ein anderes Profil im gleichen POM aktiviert ist eines der zuvor beschriebenen Verfahren unter Verwendung von

So können Sie zwei Profile hinzufügen, von denen eines activeByDefault ist, das das relevante Plugin enthält, und ein anderes, das auf jede Standardmethode (wie -P von der Befehlszeile) aktiviert werden kann, um den Standard zu verhindern Profil vom Laufen. Der profiles Abschnitt in Ihrem pom.xml (oder Maven Einstellungen oder was auch immer), könnten daher wie folgt aussehen:

<profile> 
    <id>source-jars</id> 
    <activation> 
    <activeByDefault>true</activeByDefault> 
    </activation> 
    <build> 
    <plugins> 
     <plugin> 
     <groupId>org.apache.maven.plugins</groupId> 
     <artifactId>maven-source-plugin</artifactId> 
     ... 
     </plugin> 
    </plugins> 
    </build> 
</profile> 
<profile> 
    <!-- active this profile to disable the source-jars plugin --> 
    <id>no-optional-plugins</id> 
</profile> 

Leider kann ich nicht sehen, wie man auf diese Methode zur Steuerung mehrerer Plugins gut machen skalieren - ich glaube, Sie brauchen O(n^2) Profile für n Plugins, aber für diesen einfachen Fall sollte es gut funktionieren.

Eine weitere möglicherweise einfachere Option mit Maven ≥ 2.0.10 ist nur noch das source-jars Profil von oben (noch activeByDefault) und zu manually deactivate the profile, wenn Sie möchten, indem Sie die Profil-ID mit - oder ! nach -P CLI Flagge prefixing:

$ mvn -P !source-jars 

Dieses Verfahren hat nicht die gleichen O(n^2) Probleme mit mehreren Plugins, aber es ist auch weniger flexibel, da die Deaktivierung nicht durch eine Systemeigenschaft, Umgebungsvariable, JDK-Version usw. ausgelöst werden kann

+0

Danke, dieses Beispiel hat dir wirklich geholfen – Hoto

Verwandte Themen