2016-01-12 117 views
14

我將創建一個多模塊原型。它會生成幾個模塊。原型的一些用戶可能需要所有這些,而有些只需要其中的一些。多模塊maven原型可以設置爲可選模塊嗎?

我的原型可以從命令行獲取參數並決定生成哪些模塊?我檢查了https://maven.apache.org/archetype/archetype-models/archetype-descriptor/archetype-descriptor.html,它似乎不支持。

+1

與此問題相關:https://issues.apache.org/jira/browse/ARCHETYPE-274 –

+0

另請參閱https://issues.apache.org/jira/browse/ARCHETYPE-494。 – manouti

回答

3

我已分叉項目並添加了一項功能,以啓用或禁用基於傳遞給Maven會話的屬性生成子模塊。

請參閱https://github.com/manouti/maven-archetype

當調用create-from-project目標時,通過設置-DgenerateEnableProperties=true,該插件將以generate.module.X的形式爲每個子模塊創建啓用器屬性。之後在調用generate目標時,可以通過傳遞-Dgenerate.module.X=false來排除模塊。

或者:

您可能能夠通過在描述符,這允許在現有項目的頂部上的項目的產生設定partial="true"來解決此使用部分原型。 This post似乎解決了同樣的問題。

然後,您可以編寫一個腳本,該腳本採用所需的屬性並使用部分原型生成項目的相應部分,例如,使用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> 

更新(16年6月11日):

一個相關的問題是https://issues.apache.org/jira/browse/ARCHETYPE-494。從提交者的描述:

在那裏你可以指定一個groovy文件,它將在原型生成後執行。我個人使用這個groovy文件做類似的事情:我從命令行讀取屬性,然後刪除用戶可能不需要的聲明的依賴項,類和jsp文件。

5

在這種特定的情況下,原型總是可以創建所需的所有模塊和移動不同口味(模塊組)成型材。默認情況下,只有一個配置文件在archetype:generate步驟中處於激活狀態。

因此,如果我想有一組模塊用於flavorA,我將運行原型爲

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

而且原型將這個變量傳遞給flavorA輪廓重的activeByDefault元素 - 爲flavorA用戶所需的一組模塊定義modules元素。

同樣可以完成對flavorBflavorB(例如),每一個都限定一組不同的模塊。

這樣的聚合器/父POM作爲原型的一部分的一個例子是:

<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> 

archetype-metadata.xml文件然後可以指定:

<requiredProperties> 
    <requiredProperty key="flavourA"> 
     <defaultValue>false</defaultValue> 
    </requiredProperty> 
    <requiredProperty key="flavourB"> 
     <defaultValue>false</defaultValue> 
    </requiredProperty> 
    <requiredProperty key="flavourC"> 
     <defaultValue>false</defaultValue> 
    </requiredProperty> 
</requiredProperties> 

並與-DflavorB=true調用的原型選項會生成一個pom,如下所示:

<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> 

這種方法具有以下優點和缺點:

優勢

  • 你保持共同的模塊,並在一個集中的地方原型維護,同時使口味的選擇的用戶原型
  • 原型的用戶可以根據需要並以零成本從一種風格切換到另一種風格,只需激活/取消配置文件
  • 該方法使用標準Maven特性

缺點

  • 每個原型將產生一整套模塊,即使不是所有的人都將被要求
  • 如果真的是「噪音」,用戶可以手動刪除不期望的模塊,但仍然將是一個手動操作

此外,在噸的頂他的方法如上所述,我們也可以在每個配置文件中配置Maven Clean Plugin,以刪除不受其風格影響的模塊,以便在其第一個版本(maven clean)中刪除任何不需要的模塊。儘管如此,這種方法會使POM的分佈不一致,但也可以考慮(不推薦)。

喜歡的東西:

<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

我想你問的是這個問題的背景:

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

我有它已經實施和將被納入下一版本的maven原型插件。在那裏你可以指定一個groovy文件,它將在原型生成之後執行。我個人使用這個groovy文件做類似的事情:我從命令行讀取屬性,然後刪除用戶可能不需要的聲明的依賴項,類和jsp文件。

請讓我知道,如果有幫助。