2016-01-12 51 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文件。

请让我知道,如果有帮助。