首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >可以将多模块maven原型设置为具有可选模块吗?

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

Stack Overflow用户
提问于 2016-01-12 11:19:54
回答 3查看 3.4K关注 0票数 14

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

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

EN

回答 3

Stack Overflow用户

发布于 2016-01-27 00:30:20

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

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

代码语言:javascript
复制
mvn archetype:generate -DarchetypeGroupId=.. -DflavorA=true

原型将把这个变量传递给flavorA概要文件的activeByDefault元素,为flavorA用户所需的一组模块重新定义modules元素。

对于flavorB和flavorB (例如)也可以这样做,每个都定义了一组不同的模块。

这样的聚合器/父POM作为原型的一部分的示例如下:

代码语言:javascript
复制
<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文件可以指定:

代码语言:javascript
复制
<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,如下所示:

代码语言:javascript
复制
<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>

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

优势

将通用模块和原型维护放在一个集中的位置,而让原型的archetype

  • Users的用户选择风格,如果需要,可以零成本地从一种风格切换到另一种风格,只需激活/停用配置文件
  • 该方法使用标准的Maven

Disadvantages

  • 每个原型都会生成整个模块集,即使不是所有的模块都会被需要
  • 如果真的是一个“杂音”,用户可以手动删除不需要的模块,但它仍然会是一个手动操作

此外,在上面的方法之上,我们还可以在每个概要中配置Maven Clean插件,以删除与其风格无关的模块,以便在其第一次构建( maven clean)时,任何不需要的模块都将被删除。这样的方法会给POM留下不一致的配置文件,但也可以考虑(不推荐)。

类似于:

代码语言:javascript
复制
<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>
票数 5
EN

Stack Overflow用户

发布于 2016-01-24 19:57:11

我已经对项目进行了派生,并添加了一个特性,以根据传递给Maven会话的属性启用或禁用子模块的生成。

参见https://github.com/manouti/maven-archetype

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

Alternatively:

您可以通过在描述符中设置partial="true"来使用部分原型解决此问题,这允许在现有项目的基础上生成项目。This post似乎也在解决同样的问题。

然后,您可以编写一个脚本,该脚本获取所需的属性,并使用部分原型生成项目的相应部分,例如使用Ant:

代码语言:javascript
复制
<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>

更新(6/11/16):

一个相关的问题是https://issues.apache.org/jira/browse/ARCHETYPE-494。根据提交者的描述:

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

票数 3
EN

Stack Overflow用户

发布于 2016-06-09 17:51:24

我认为你所问的是在这个问题的背景下:

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

我已经实现了它,并将包含在下一个版本的maven原型插件中。您可以在其中指定一个groovy文件,该文件将在原型生成后执行。我个人使用这个groovy文件来做类似的事情:我从命令行读取属性,然后删除用户可能不需要的声明的依赖项、类和jsp文件。

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34735040

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档