我将创建一个多模块原型。它会生成几个模块。原型的一些用户可能需要所有这些,而有些只需要其中的一些。多模块maven原型可以设置为可选模块吗?
我的原型可以从命令行获取参数并决定生成哪些模块?我检查了https://maven.apache.org/archetype/archetype-models/archetype-descriptor/archetype-descriptor.html,它似乎不支持。
我将创建一个多模块原型。它会生成几个模块。原型的一些用户可能需要所有这些,而有些只需要其中的一些。多模块maven原型可以设置为可选模块吗?
我的原型可以从命令行获取参数并决定生成哪些模块?我检查了https://maven.apache.org/archetype/archetype-models/archetype-descriptor/archetype-descriptor.html,它似乎不支持。
我已分叉项目并添加了一项功能,以启用或禁用基于传递给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文件。
在这种特定的情况下,原型总是可以创建所需的所有模块和移动不同口味(模块组)成型材。默认情况下,只有一个配置文件在archetype:generate
步骤中处于激活状态。
因此,如果我想有一组模块用于flavorA,我将运行原型为
mvn archetype:generate -DarchetypeGroupId=.. -DflavorA=true
而且原型将这个变量传递给flavorA轮廓重的activeByDefault
元素 - 为flavorA用户所需的一组模块定义modules
元素。
同样可以完成对flavorB和flavorB(例如),每一个都限定一组不同的模块。
这样的聚合器/父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 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>
我想你问的是这个问题的背景:
https://issues.apache.org/jira/browse/ARCHETYPE-494
我有它已经实施和将被纳入下一版本的maven原型插件。在那里你可以指定一个groovy文件,它将在原型生成之后执行。我个人使用这个groovy文件做类似的事情:我从命令行读取属性,然后删除用户可能不需要的声明的依赖项,类和jsp文件。
请让我知道,如果有帮助。
与此问题相关:https://issues.apache.org/jira/browse/ARCHETYPE-274 –
另请参阅https://issues.apache.org/jira/browse/ARCHETYPE-494。 – manouti