Überspringen Sie ein Submodul während eines Maven-Builds

160

In bestimmten Umgebungen muss ein Submodul übersprungen werden können.

Das betreffende Modul enthält Integrationstests und dauert eine halbe Stunde. Wir möchten es also beim Erstellen auf dem CI-Server einbeziehen, aber wenn Entwickler lokal erstellen (und Tests ausgeführt werden), möchten wir dieses Modul überspringen.

Gibt es eine Möglichkeit, dies mit einer Profileinstellung zu tun? Ich habe ein bisschen gegoogelt und mir die anderen Fragen / Antworten hier angesehen und keine gute Lösung gefunden.

Ich nehme an, eine Option besteht darin, dieses Submodul pom.xmlvollständig aus dem übergeordneten Modul zu entfernen und einfach ein weiteres Projekt auf unserem CI-Server hinzuzufügen, um nur dieses Modul zu erstellen.

Vorschläge?

Denishaskin
quelle
Warum nicht Maven Way? Es ist eine absolut gültige Behauptung für mich.
MaDa
Hmm. Jetzt kann ich die Orte nicht finden, an denen die Leute dagegen zu argumentieren schienen ... also habe ich meine ursprüngliche Frage aktualisiert, um meine Behauptung zu entfernen, dass dies nicht "The Maven Way" zu sein scheint.
Denishaskin

Antworten:

149

Sicher, dies kann mit Profilen erfolgen. In der übergeordneten Datei pom.xml können Sie Folgendes tun.

  ...
   <modules>
      <module>module1</module>
      <module>module2</module>  
      ...
  </modules>
  ...
  <profiles>
     <profile>
       <id>ci</id>
          <modules>
            <module>module1</module>
            <module>module2</module>
            ...
            <module>module-integration-test</module>
          </modules> 
      </profile>
  </profiles>
 ...

In Ihrem CI würden Sie maven mit dem ciProfil ausführen , dhmvn -P ci clean install

Raghuram
quelle
4
Hervorragende Antwort! Ich weiß nicht, warum ich so große Probleme hatte, dies aus den Maven-Dokumenten herauszufinden. Der einzige Vorschlag, den ich machen würde, ist, dass ich, da ich die Integrationstests standardmäßig ausführen möchte, activeByDefaultdiesem Profil hinzugefügt habe und dann ein weiteres leeres Profil (z. B. skip-integration-tests) hinzufügen musste, um sie überspringen zu können.
Denishaskin
7
Gibt es eine Möglichkeit, dies zu tun, ohne alle gemeinsam genutzten Inhalte zu duplizieren?
JonnyRaa
7
Achtung, wenn Sie das Maven-Release-Plugin verwenden, scheint es, dass es die Versionsnummer der Submodule, die hinter einem Profilschalter versteckt sind, nicht aktualisiert. Sie könnten
Submodule
8
Wenn Sie das Profil verwenden, können Sie leider kein Modul ausschließen, das zuvor im Hauptteil <modules> des pom erwähnt wurde. Die JIRA-Probleme.apache.org/jira/browse/MNG-5230 (und die gesamte POM- Struktur) hätten mit etwas sorgfältigerem Überlegen viel besser vollständig implementiert werden können.
Ed Randall
2
funktioniert diese Lösung wirklich? Zumindest kann ich es nicht zum Laufen bringen. Scheint, als hätte ich das gleiche Problem wie @EdRandall
Gerros
231

Maven Version 3.2.1 hat diese Funktion hinzugefügt. Sie können den -plSchalter ( Verknüpfung für --projectsListe) mit !oder -( Quelle ) verwenden, um bestimmte Submodule auszuschließen.

mvn -pl '!submodule-to-exclude' install
mvn -pl -submodule-to-exclude install

Sei vorsichtig, wenn du den Charakter schlägst! ist ein Sonderzeichen, daher müssen Sie es entweder in einfache Anführungszeichen setzen (wie ich) oder es mit dem Backslash-Zeichen maskieren.

Die Syntax zum Ausschließen mehrerer Module entspricht der Einbeziehung

mvn -pl '!submodule1,!submodule2' install
mvn -pl -submodule1,-submodule2 install

BEARBEITEN Windows scheint die einfachen Anführungszeichen nicht zu mögen, aber es ist in bash notwendig; Verwenden Sie in Windows doppelte Anführungszeichen (danke @awilkinson)

mvn -pl "!submodule1,!submodule2" install
Alexandre DuBreuil
quelle
27
Wichtig: Wenn Sie ein verschachteltes Submodul ausschließen möchten, müssen Sie die qualifizierte Version verwendenmvn -pl !com.acme:nestedmodule1
Leonard Brünings
3
Die Option -pl benötigt vor der Artefakt-ID '[groupId]:', daher sollten wir mvn -pl '! Verwenden: submodule-to-exclude' install
Honsen
4
Sie können auch mvn -pl '!path/to/submodule/directory'ohne groupId und artefaktId verwenden. Meine Antwort funktioniert, wenn submodule1und submodule2sich im aktuellen Verzeichnis befinden.
Alexandre DuBreuil
Es lohnt sich auch nichts, wenn Sie verwenden -plin mvn install, Sie werden es wahrscheinlich verwenden müssen mvn deployauch
majikman
39

Sie können entscheiden, welche Reaktorprojekte erstellt werden sollen, indem Sie das -plBefehlszeilenargument angeben:

$ mvn --help
[...]
 -pl,--projects <arg>                   Build specified reactor projects
                                        instead of all projects
[...]

Es akzeptiert eine durch Kommas getrennte Liste von Parametern in einer der folgenden Formen:

  • relativer Pfad des Ordners, der das POM enthält
  • [groupId]:artifactId

Somit ergibt sich folgende Struktur:

project-root [com.mycorp:parent]
  |
  + --- server [com.mycorp:server]
  |       |
  |       + --- orm [com.mycorp.server:orm]
  |
  + --- client [com.mycorp:client]

Sie können die folgende Befehlszeile angeben:

mvn -pl .,server,:client,com.mycorp.server:orm clean install

alles bauen. Entfernen Sie die Elemente in der Liste, um nur die gewünschten Module zu erstellen.


BEARBEITEN : Wie Blackbuild hervorhob , haben Sie ab Maven 3.2.1 eine neue -elFlagge , die Projekte aus dem Reaktor ausschließt, ähnlich -plwie:

Skuro
quelle
1
Vielen Dank. Das hat bei mir gut funktioniert. Beachten Sie auch, dass Sie "-am" (AKA "--also-make") hinzufügen können, um auch Projekte zu erstellen, die für die von Ihnen angegebenen Module erforderlich sind.
GaZ
1
Toll! Ich habe verwendet mvn install -pl ., um übergeordnete POM nur in lokalen Repo zu installieren, ohne Module zu erstellen.
Marcin
Schauen Sie sich auch jira.codehaus.org/browse/MNG-5230 an . Sie können jetzt Projekte aus dem Reaktor ausschließen.
Blackbuild
1
MNG-5230 Link seit Codehaus.org geschlossen: Issues.apache.org/jira/browse/MNG-5230
Ed Randall
Leider funktioniert es nicht transitiv, dh wenn ich top / mod1 / mod2 habe und von oben baue, löst -pl '! Mod2' einen Fehler aus.
Zakmck
4

Der Begriff der Projekte mit mehreren Modulen dient dazu, die Anforderungen von codependenten Segmenten eines Projekts zu erfüllen. Ein solcher Client hängt von den Diensten ab, die wiederum beispielsweise von EJBs oder Datenzugriffsroutinen abhängen. Du könntest Gruppe Ihre kontinuierliche Integration (CI) Tests auf diese Weise. Ich würde das rationalisieren, indem ich sage, dass die CI-Tests mit Änderungen der Anwendungslogik Schritt halten müssen.

Angenommen, Ihr Projekt ist wie folgt strukturiert:

project-root
  |
  + --- ci
  |
  + --- client
  |
  + --- server

Das project-root/pom.xmldefiniert Module

<modules>
  <module>ci</module>
  <module>client</module>
  <module>server</module>
</modules>

Das ci/pom.xmldefiniert Profile wie:

... 
<profiles>
  <profile>
    <id>default</id>
    <activation>
      <activeByDefault>true</activeByDefault>
    </activation>
    <plugin>
       <artifactId>maven-surefire-plugin</artifactId>
       <configuration>
         <skip>true</skip>
       </configuration>
     </plugin>
  </profile>
  <profile>
    <id>CI</id>
    <plugin>
       <artifactId>maven-surefire-plugin</artifactId>
       <configuration>
         <skip>false</skip>
       </configuration>
     </plugin>
  </profile>
</profiles>

Dies führt dazu, dass Maven in diesem Modul Tests überspringt, es sei denn, das genannte Profil CIist aktiv. Ihr CI-Server muss zur Ausführung angewiesen werden mvn clean package -P CI. Auf der Maven-Website wird der Profilierungsmechanismus ausführlich erläutert .

Sri Sankaran
quelle
2

Es gibt jetzt (ab Version 1.1.1) eine "Überspringen" -Flagge in der Grube.

So können Sie Dinge tun wie:

    <profile>
        <id>pit</id>
        <build>
            <plugins>
                <plugin>
                    <groupId>org.pitest</groupId>
                    <artifactId>pitest-maven</artifactId>
                    <configuration>
                        <skip>true</skip>
                    </configuration>
                </plugin>
            </plugins>
        </build>
    </profile>

in Ihrem Modul, und Grube wird überspringen

[INFO] --- pitest-maven: 1.1.3: mutationsCoverage (default-cli) @ module-selenium --- [INFO] Projekt überspringen

Twillouer
quelle