我打算创建一个多模块原型。它将生成几个模块。原型的一些用户可能需要所有这些用户,而有些用户只需要其中一些用户。
我的原型可以从命令行获取参数并决定生成哪些模块吗?我检查了https://maven.apache.org/archetype/archetype-models/archetype-descriptor/archetype-descriptor.html,似乎并不支持。
答案 0 :(得分:5)
在这种特定情况下,原型可以始终创建所有必需的模块,并将不同的 flavor (模块集)移动到配置文件中。默认情况下,只有一个配置文件在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插件以删除与其风格无关的模块,以便在第一次构建时(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>
答案 1 :(得分:3)
我已经分叉了项目并添加了一个功能,可以根据传递给Maven会话的属性启用或禁用子模块的生成。
请参阅https://github.com/manouti/maven-archetype。
通过在调用-DgenerateEnableProperties=true
目标时设置create-from-project
,插件将为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>
更新(6/11/16):
相关问题是https://issues.apache.org/jira/browse/ARCHETYPE-494。从提交者的描述:
在那里你可以指定一个groovy文件,它将在原型生成后执行。我个人使用这个groovy文件做类似的事情:我从命令行读取属性,然后删除用户可能不需要的声明的依赖项,类和jsp文件。
答案 2 :(得分:0)
我认为你所问的是在这个问题的背景下:
https://issues.apache.org/jira/browse/ARCHETYPE-494
我已经实现了它,并将包含在maven archetype插件的下一个版本中。在那里你可以指定一个groovy文件,它将在原型生成后执行。我个人使用这个groovy文件做类似的事情:我从命令行读取属性,然后删除用户可能不需要的声明的依赖项,类和jsp文件。
如果有帮助,请告诉我。