可以将多模块maven原型设置为具有可选模块吗?

Jia*_*hen 14 maven multi-module maven-archetype

我将创建一个多模块原型.它将生成几个模块.原型的一些用户可能需要所有这些用户,而有些用户只需要其中的一些用户.

我的原型可以从命令行获取参数并决定生成哪些模块吗?我检查了https://maven.apache.org/archetype/archetype-models/archetype-descriptor/archetype-descriptor.html ,它似乎不支持.

A_D*_*teo 5

在这种特定情况下,原型可以始终创建所有必需的模块,并将不同的风格(模块集)移动到配置文件中.默认情况下,只有一个配置文件在archetype:generate步骤中指定.

因此,如果我想拥有flavorA的模块,我将运行原型为

mvn archetype:generate -DarchetypeGroupId=.. -DflavorA=true
Run Code Online (Sandbox Code Playgroud)

原型将把这个变量传递给activeByDefaultflavorA配置文件的元素,重新定义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>
Run Code Online (Sandbox Code Playgroud)

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>
Run Code Online (Sandbox Code Playgroud)

然后使用该-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>
Run Code Online (Sandbox Code Playgroud)

这种方法具有以下优点和缺点:

好处

  • 您将常用模块和原型维护保存在一个集中的位置,同时将选择的风味保留给原型的用户
  • 如果需要并且零成本,原型的用户可以从一种味道切换到另一种味道,只需激活/停用配置文件
  • 该方法使用标准Maven功能

缺点

  • 每个原型都将生成整个模块集,即使并非所有模块都是必需的
  • 如果真的是"噪音",用户可以手动删除不需要的模块,但仍然是手动操作

此外,除了上述方法之外,我们还可以在每个配置文件中配置Maven Clean Plugin以删除与其风格无关的模块,以便在其第一次构建(a 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>
Run Code Online (Sandbox Code Playgroud)


man*_*uti 3

我已经分叉了该项目并添加了一项功能来根据传递到 Maven 会话的属性启用或禁用子模块的生成。

请参阅https://github.com/manouti/maven-archetype

通过-DgenerateEnableProperties=true在调用create-from-project目标时进行设置,插件将为表单中的每个子模块创建启用程序属性generate.module.X。此后调用generate目标时,可以通过传递 来排除模块-Dgenerate.module.X=false

或者:

您可以通过partial="true"在描述符中进行设置,使用部分原型来解决此问题,这允许在现有项目之上生成项目。这篇文章似乎解决了同样的问题。

然后,您可以编写一个脚本,该脚本采用所需的属性并使用部分原型生成项目的相应部分,例如使用 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>
Run Code Online (Sandbox Code Playgroud)

更新(2016 年 6 月 11 日):

相关问题是https://issues.apache.org/jira/browse/ARCHETYPE-494。从提交者的描述来看:

在那里您可以指定一个 groovy 文件,该文件将在原型生成后执行。我个人使用这个 groovy 文件来做类似的事情:我从命令行读取属性,然后删除用户可能不需要的声明的依赖项、类和 jsp 文件。