2013-07-14 22 views
9

Meine Frage wurde in this thread adressiert, aber die Erklärung ist nicht klar.Maven 3 Profil mit Erweiterungen

Ich habe diese Builddefinition in einen meiner pom.xml Dateien:

<build> 
    <finalName>${my.project}</finalName> 
    <plugins> 
     <plugin> 
      <groupId>org.apache.maven.plugins</groupId> 
      <artifactId>maven-compiler-plugin</artifactId> 
      <version>2.0</version> 
      <configuration> 
       <source>1.6</source> 
       <target>1.6</target> 
      </configuration> 
     </plugin> 
    </plugins> 
    <extensions> 
     <extension> 
      <groupId>org.kuali.maven.wagons</groupId> 
      <artifactId>maven-s3-wagon</artifactId> 
      <version>1.1.19</version> 
     </extension> 
    </extensions> 
    <resources> 
     <resource> 
      <directory>src/main/resources</directory> 
      <filtering>true</filtering> 
      <includes> 
       <include>**/settings.properties</include> 
      </includes> 
     </resource> 
    </resources> 
</build> 

Beachten Sie, dass ich die Maven-s3-Wagen Erweiterung. Als nächstes möchte ich 2 verschiedene Profile haben, jedes mit seinen eigenen Einstellungen, Plugins und Erweiterungen, aber maven erlaubt das Extensions-Tag nicht unter einem Profil.

Wenn ich ein Profil versuchen, mit:

<profiles> 
    <profile> 
     <id>local-build</id> 
     <activation> 
      <activeByDefault>true</activeByDefault> 
     </activation> 
     <build> 
      <finalName>${my.project}</finalName> 
      <plugins> 
       <plugin> 
        <groupId>org.apache.maven.plugins</groupId> 
        <artifactId>maven-compiler-plugin</artifactId> 
        <version>2.0</version> 
        <configuration> 
         <source>1.6</source> 
         <target>1.6</target> 
        </configuration> 
       </plugin> 
      </plugins> 
      <extensions> 
       <extension> 
        <groupId>org.kuali.maven.wagons</groupId> 
        <artifactId>maven-s3-wagon</artifactId> 
        <version>1.1.19</version> 
       </extension> 
      </extensions> 
      <resources> 
       <resource> 
        <directory>src/main/resources</directory> 
        <filtering>true</filtering> 
        <includes> 
         <include>**/settings.properties</include> 
        </includes> 
       </resource> 
      </resources> 
     </build> 
    </profile> 
</profiles> 

ich einen Fehler in meiner pom erhalten:

cvc-complex-type.2.4.a: Invalid content was found starting with element 'extensions'. One of '{"http://maven.apache.org/POM/4.0.0":defaultGoal, "http://maven.apache.org/POM/ 
4.0.0":resources, "http://maven.apache.org/POM/4.0.0":testResources, "http://maven.apache.org/POM/4.0.0":directory, "http://maven.apache.org/POM/4.0.0":filters, "http:// 
maven.apache.org/POM/4.0.0":pluginManagement}' is expected. 

Frage So die Erweiterung-Tag bedeutet, dass ich keine Profile verwenden kann? Wie kann ich Build-Erweiterungen über ein Profil verwenden oder ändern?

Antwort

4

Tatsächlich ist die offizielle Maven POM reference ist nicht klar, über die mögliche Verwendung von extensions als Teil eines Maven Profil, da es heißt, können Sie ein build Element in ihm, aber nicht das, was der build Abschnitt.

Die offizielle Maven model effektiv filtert und bietet, was der build Abschnitt können Sie tatsächlich in einem profile Abschnitt verwenden. Und in der Tat extensionsist nicht.

Was sind Maven Erweiterungen? Build/Lifecycle-Erweiterung, aber auch (und im Wesentlichen): eine Bibliothek, die dem Laufzeitklassenpfad des Maven-Builds hinzugefügt wurde, der am Build beteiligt ist, aber nicht mit dem endgültigen Artefakt gepackt ist.

daher in einem solchen Szenario (wenn Sie Erweiterungen im Profil haben müssen oder ein Profil zu ändern/eine Erweiterung hinzufügen) können Sie den folgenden Trick verwenden:

  • Haben sie eine harmlose Erweiterung als Standarderweiterung Ihrer Build (wo harmlose Mittel unabhängig Bibliothek, die Teil des Build classpath sein könnte und beeinflussen sie im wesentlichen nicht)
  • haben Eigenschaften, die GAV-Koordinaten (G roupId, A rtifactId, V ersion) definiert, von diesem extens
  • ion
  • haben ein Profil, das diese Eigenschaften mit der gewünschten (nützlich) Verlängerungs

Als Beispiel überschreibt, angesichts der folgenden Beispiel POM:

<project> 
    <modelVersion>4.0.0</modelVersion> 
    <groupId>com.sample</groupId> 
    <artifactId>project</artifactId> 
    <version>0.0.1-SNAPSHOT</version> 

    <properties> 
     <extension.groupId>junit</extension.groupId> 
     <extension.artifactId>junit</extension.artifactId> 
     <extension.version>4.11</extension.version> 
    </properties> 

    <build> 
     <extensions> 
      <extension> 
       <groupId>${extension.groupId}</groupId> 
       <artifactId>${extension.artifactId}</artifactId> 
       <version>${extension.version}</version> 
      </extension> 
     </extensions> 
    </build> 

    <profiles> 
     <profile> 
      <id>customize-extension</id> 
      <properties> 
       <extension.groupId>junit</extension.groupId> 
       <extension.artifactId>junit</extension.artifactId> 
       <extension.version>4.12</extension.version> 
      </properties> 
     </profile> 
    </profiles> 

</project> 

Der Standard build (ohne das customize-extension Profil aktiviert), würde den standardmäßig definierten Wert properties verwenden und als solchen junit als Build-Erweiterung hinzufügen: das ist harmlos (obwohl es Konflikte mit einer anderen junit Version Ihres Builds verursachen kann, also stellen Sie sicher, dass Sie die gleiche Version eines noch harmloseren verwenden) Bibliothek dafür).

Sie können prüfen, Maven es abholen ein wirklich ersten build phase, indem Sie nur Informationen in unserem Fall zu überprüfen und den Debug-Flag aktivieren:

mvn initialize -X 

Und Überprüfung als Teil des Build-Log:

[DEBUG] Populating class realm extension>junit:junit:4.11 
[DEBUG] Included: junit:junit:jar:4.11 

lassen Sie sich jetzt unseren Trick: fügen sie (ändern) eine Build-Erweiterung über Profil:

mvn initialize -X -Pcustomize-extension 

Und als Teil unserer Buildprotokoll hätten wir:

[DEBUG] Populating class realm extension>junit:junit:4.12 
[DEBUG] Included: junit:junit:jar:4.12 

Bingo. Maven hat eine andere Erweiterung (in diesem Fall eine andere Version, die 4.12) ausgewählt und es ist uns gelungen, eine Build-Erweiterung über ein Profil zu ändern (oder tatsächlich eine sinnvolle Erweiterung hinzuzufügen).

0

Nur eine verrückte Idee: Verwendung Module

definieren Mutter pom wie folgt aus:

<groupId>org.example</groupId> 
<artifactId>my-parent</artifactId> 
<version>1.0</version> 
<packaging>pom</packaging> 
<profiles> 
    <profile> 
     <id>use-pom1</id> 
     <modules> 
      <module>pom1</module> 
     </modules> 
    </profile> 
    <profile> 
     <id>use-pom2</id> 
     <modules> 
      <module>pom2</module> 
     </modules> 
    </profile> 
</profiles> 

Definieren Sie die gewünschten Erweiterungen auf pom1 und pom2.

+0

der Tat eine interessante Idee, aber es könnte Sachen komplizieren. Da dies ein Produktionssystem ist, versuche ich eine einfachere \ stable \ amtlich \ getestete Lösung zu finden. Thanks though – forhas

+0

Nun, Sie könnten versuchen, 'Maven-Assembly-Plugin' zu verwenden, mit einer descriptor.xml. Aber ich bezweifle, dass es tun würde, was deine Erweiterungen tun. –

0

ich glaube, die Lösung ist hier http://maven.apache.org/guides/mini/guide-using-extensions.html

einen Build Abschnitt definieren, wo Erweiterungen definiert werden und dann in das Profil das Attribut true gesetzt (wie in dem zweiten Profil unten)

<build> 
    <extensions> 
     <extension> 
      <groupId>org.apache.maven.wagon</groupId> 
      <artifactId>wagon-ssh</artifactId> 
      <version>2.9</version> 
     </extension> 
    </extensions> 
</build> 

<profiles> 
    <profile> 
     <id>create-default</id> 
     <activation> 
      <activeByDefault>true</activeByDefault> 
      <property> 
       <name>build</name> 
       <value>full</value> 
      </property> 
     </activation> 
     <build> 
      <plugins> 
       <plugin> 
        <groupId>org.springframework.boot</groupId> 
        <artifactId>spring-boot-maven-plugin</artifactId> 
        <executions> 
         <execution> 
          <goals> 
           <goal>repackage</goal> 
          </goals> 
         </execution> 
        </executions> 
       </plugin> 
      </plugins> 
     </build> 
    </profile> 

    <profile> 
     <id>create-core</id> 
     <activation> 
      <property> 
       <name>build</name> 
       <value>full</value> 
      </property> 
     </activation> 
     <build> 
      <plugins> 
       <plugin> 
        <groupId>org.apache.maven.plugins</groupId> 
        <artifactId>maven-jar-plugin</artifactId> 
        <extensions>true</extensions> 
        <version>2.6</version> 
        <configuration> 
         <finalName>import-station-core-${project.version}</finalName> 
        </configuration> 
        <executions> 
         <execution> 
          <id>make-jar</id> 
          <phase>package</phase> 
          <goals> 
           <goal>jar</goal> 
          </goals> 
         </execution> 
        </executions> 
       </plugin> 
      </plugins> 
     </build> 
    </profile> 
</profiles> 
Verwandte Themen