2016-01-12 11 views
14

Ich werde einen Archetyp mit mehreren Modulen erstellen. Es wird mehrere Module generieren. Einige Benutzer des Archetyps benötigen möglicherweise alle von ihnen, während einige nur einige von ihnen benötigen.Kann ein Maven-Archetyp mit mehreren Modulen für optionale Module eingerichtet werden?

Kann mein Archetyp Argumente von der Befehlszeile übernehmen und entscheiden, welche Module generiert werden sollen? Ich habe https://maven.apache.org/archetype/archetype-models/archetype-descriptor/archetype-descriptor.html überprüft und es scheint das nicht zu unterstützen.

+1

In Bezug auf dieses Problem: https://issues.apache.org/jira/browse/ARCHETYPE-274 –

+0

Siehe auch https://issues.apache.org/jira/browse/ARCHETYPE-494. – manouti

Antwort

3

Ich habe das Projekt gegabelt und eine Funktion hinzugefügt, um die Generierung von Submodulen basierend auf Eigenschaften zu aktivieren oder zu deaktivieren, die an die Maven-Sitzung übergeben wurden.

Siehe https://github.com/manouti/maven-archetype.

Durch die Einstellung -DgenerateEnableProperties=true beim Aufrufen des Ziels create-from-project erstellt das Plug-in Enabler-Eigenschaften für jedes untergeordnete Modul im Format generate.module.X. Wenn danach das Ziel generate aufgerufen wird, kann ein Modul durch Übergeben von -Dgenerate.module.X=false ausgeschlossen werden.

Alternativ:

Sie in der Lage sein dies mit teilweise Urbilder zu umgehen, indem partial="true" in dem Descriptor Einstellung, die die Erzeugung eines Projekts auf der Oberseite eines bestehenden Projekts ermöglicht. This post scheint das gleiche Problem anzugehen.

Dann können Sie ein Skript schreiben, das die gewünschten Eigenschaften übernimmt und die entsprechenden Teile des Projekts unter Verwendung der partiellen Archetypen, z. mit Ant:

<target name="mvn.generate.project.module1" if="generate.module1"> 
    <exec dir="." executable="sh"> 
     <arg value="-c" /> 
     <arg value="mvn archetype:generate -DarchetypeGroupId="com.example.project" -DarchetypeArtifactId="archetype1" ..." /> 
    </exec> 
</target> 

<target name="mvn.generate.project.module2" if="generate.module2"> 
    <exec dir="." executable="sh"> 
     <arg value="-c" /> 
     <arg value="mvn archetype:generate -DarchetypeGroupId="com.example.project" -DarchetypeArtifactId="archetype2" ..." /> 
    </exec> 
</target> 

Update (6/11/16):

Ein ähnliches Problem ist https://issues.apache.org/jira/browse/ARCHETYPE-494. Aus der Beschreibung des Commiters:

Dort können Sie eine Groovy-Datei angeben, die nach der Archetype-Generierung ausgeführt wird. Ich persönlich benutze diese groovy Datei, um etwas ähnliches zu tun: Ich lese Eigenschaften von der Befehlszeile und entferne dann erklärte Abhängigkeiten, Klassen und jsp Dateien, die der Benutzer möglicherweise nicht benötigt.

5

In diesem speziellen Fall könnte das Urbild immer alle erforderlichen Module erstellen und die verschiedenen Aromen (Satz von Modulen) in Profile bewegen. Standardmäßig ist nur ein Profil aktiv, wie im Schritt archetype:generate angegeben.

Als solcher, wenn ich den Satz von Modulen für Flavora haben wollen, ich werde das Urbild als

mvn archetype:generate -DarchetypeGroupId=.. -DflavorA=true 

laufen Und das Urbild wird diese Variable auf den activeByDefault Element des Flavora Profil re passieren - Definieren des Elements modules für die von den Benutzern benötigten Module flavourA.

das gleiche getan für flavorB und flavorB (zum Beispiel) werden kann, die jeweils einen anderen Satz von Modulen zu definieren.

Ein Beispiel für einen solchen Aggregator/Eltern POM als Teil des Urbild wäre:

mit dem -DflavorB=true aufgerufen
<requiredProperties> 
    <requiredProperty key="flavourA"> 
     <defaultValue>false</defaultValue> 
    </requiredProperty> 
    <requiredProperty key="flavourB"> 
     <defaultValue>false</defaultValue> 
    </requiredProperty> 
    <requiredProperty key="flavourC"> 
     <defaultValue>false</defaultValue> 
    </requiredProperty> 
</requiredProperties> 

Und das Urbild:

<profiles> 
    <profile> 
     <id>flavourA</id> 
     <activation> 
      <activeByDefault>${flavourA}</activeByDefault> 
     </activation> 
     <modules> 
      <module>profiled-module2</module> 
      <module>profiled-module3</module> 
     </modules> 
    </profile> 
    <profile> 
     <id>flavourB</id> 
     <activation> 
      <activeByDefault>${flavourB}</activeByDefault> 
     </activation> 
     <modules> 
      <module>profiled-module3</module> 
     </modules> 
    </profile> 
    <profile> 
     <id>flavourC</id> 
     <activation> 
      <activeByDefault>${flavourC}</activeByDefault> 
     </activation> 
     <modules> 
      <module>profiles-module1</module> 
      <module>profiled-module2</module> 
      <module>profiled-module3</module> 
     </modules> 
    </profile> 
</profiles> 

Die archetype-metadata.xml Datei dann geben könnte Option würde dann eine Pom wie folgt erzeugen:

<profiles> 
    <profile> 
     <id>flavourA</id> 
     <activation> 
      <activeByDefault>false</activeByDefault> 
     </activation> 
     <modules> 
      <module>profiled-module2</module> 
      <module>profiled-module3</module> 
     </modules> 
    </profile> 
    <profile> 
     <id>flavourB</id> 
     <activation> 
      <activeByDefault>true</activeByDefault> 
     </activation> 
     <modules> 
      <module>profiled-module3</module> 
     </modules> 
    </profile> 
    <profile> 
     <id>flavourC</id> 
     <activation> 
      <activeByDefault>false</activeByDefault> 
     </activation> 
     <modules> 
      <module>profiles-module1</module> 
      <module>profiled-module2</module> 
      <module>profiled-module3</module> 
     </modules> 
    </profile> 
</profiles> 

Ein solcher Ansatz hat folgende Vor- und Nachteile:

Vorteile

  • Sie halten die gemeinsamen Module und das Urbild Wartung an einem zentralen Ort, während die Wahl von Aromen für den Benutzer die Abgangs Archetyp
  • Benutzer des Archetyps könnten, wenn gewünscht und ohne Kosten, von einem Geschmack zum anderen wechseln nur Profile aktivieren/deaktivieren
  • Der Ansatz verwendet Standard-Maven-Funktionen

Nachteile

  • Jeder Urbild wird die ganze Reihe von Modulen erzeugen, auch wenn nicht alle von ihnen werden
  • Wenn wirklich ein „Rauschen“ erforderlich, der Benutzer manuell die löschen könnte unerwünschte Module, aber dennoch wäre es eine manuelle Aktion

Außerdem oben auf t sein Wie oben beschrieben, können wir auch das Maven Clean Plugin in jedem Profil konfigurieren, um die Module zu löschen, die nicht von seinem Geschmack betroffen sind, so dass bei seinem ersten Build (a maven clean) alle nicht benötigten Module gelöscht werden. Solch ein Ansatz würde das POM zwar mit inkonsistenten Profilen verlassen, aber es könnte auch in Betracht gezogen werden (nicht empfohlen).

Etwas wie:

<profile> 
    <id>flavourA</id> 
    <activation> 
     <activeByDefault>${flavorA}</activeByDefault> 
    </activation> 
    <modules> 
     <module>profiled-module2</module> 
     <module>profiled-module3</module> 
    </modules> 

    <build> 
     <plugins> 
      <plugin> 
       <groupId>org.apache.maven.plugins</groupId> 
       <artifactId>maven-clean-plugin</artifactId> 
       <version>3.0.0</version> 
       <configuration> 
        <filesets> 
         <fileset> 
          <directory>${basedir}/profiled-module1</directory> 
         </fileset> 
        </filesets> 
       </configuration> 
      </plugin> 
     </plugins> 
    </build> 
</profile> 
0

denke ich, was Sie fordern im Zusammenhang mit dieser Frage ist:

https://issues.apache.org/jira/browse/ARCHETYPE-494

Ich habe es bereits umgesetzt und wird in der nächsten Version enthalten sein des Maven-Archetyp-Plugins. Dort können Sie eine Groovy-Datei angeben, die nach der Archetype-Generierung ausgeführt wird. Ich persönlich benutze diese groovy Datei, um etwas ähnliches zu tun: Ich lese Eigenschaften von der Befehlszeile und entferne dann erklärte Abhängigkeiten, Klassen und jsp Dateien, die der Benutzer möglicherweise nicht benötigt.

Bitte lassen Sie mich wissen, wenn das hilft.

Verwandte Themen