我找不到一个好的、可扩展的解决方案的问题:
我有一个项目可以提供给定工件的多种风格。这已被设置为一个多模块项目,目前有 3 个模块:
- /flavor1_module
- /flavor2_module
- /flavor3_module
问题是我还有另外 50 个项目需要以相同的方式设置,即提供 3 种风格。
考虑的解决方案:
- 将已经创建的多模块项目变成所有其他 50 个项目的父项目
- 缺点:它只是不起作用。保存在父模块中的指令不会被继承,因此它们不会被执行。
- 使用maven-archetype-plugin创建一个多模块项目模板,然后基于该模板创建全部 50 个项目
- 缺点:如果我需要 flavor4,我需要手动更新所有 50 个项目以添加 flavor4_module(并复制其内容)。不可扩展。
- 将所有风味的配置嵌入到单个 pom 中,并根据配置文件启用或禁用它们(即使用配置文件组合而不是通过模块继承)。然后将 50 个项目指向它,作为它们的父级。这将创建“内联”模块
- 缺点:我需要实现我自己的机制,这些机制由开箱即用的模块提供。(例如,在单独的目录中构建每种风味)。我也会失去模块提供的清晰分隔。
任何想法如何做得很好?还有其他选择吗?
谢谢,卢卡斯
编辑:
另一种选择是使用reactor:inject-modules目标扩展maven-reactor-plugin,该目标将从外部工件下载模块定义,并将其定义附加为普通模块。这将动态创建一个新模块。然后所有 50 个项目都可以将此 pom.xml 作为其父项。
配置看起来像这样(草稿):
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-reactor-plugin</artifactId>
<version>1.0</version>
<executions>
<execution>
<id>inject</id>
<phase>initialize</phase>
<goals>
<goal>inject-modules</goal>
</goals>
<configuration>
<modules>
<module>
<artifactId>flavour1_module</artifactId>
<groupId>[ groupId ]</groupId>
<version>[ version ]</version>
</module>
<module>
<artifactId>flavour2_module</artifactId>
<groupId>[ groupId ]</groupId>
<version>[ version ]</version>
</module>
<module>
<artifactId>flavour3_module</artifactId>
<groupId>[ groupId ]</groupId>
<version>[ version ]</version>
</module>
</modules>
</configuration>
</execution>
</executions>
</plugin>
走这条路有意义吗?
更新:
编写一个操作要执行的模块列表的插件(我上面描述的模块注入的想法)似乎无法实现,因为模块是由 maven 核心处理的,并且该机制不是为了扩展而设计的一个插件。这可以通过两个插件完成类似工作的事实得到证实,即操纵要执行的项目列表:
通过执行系统调用来创建 Maven 子进程来解决问题。对我来说,这不是要走的路,因为它是一个非常不稳定的解决方案。实际上maven-reactor-plugin变得与 Maven3不兼容。
maven-invoker-plugin看起来仍然很有希望。该插件最初设计用于运行集成测试,但可以使用它来扩展例如编译阶段。但它要求将子 pom.xml-s 视为资源并即时修改。对于我在此处描述的问题,解决方案将过于复杂且不稳定。我更喜欢在构建 maven 模型时可以在内存中运行的更轻量级的东西。
所以现在我使用配置文件,试图使它们尽可能紧凑。可能在一段时间内,我需要再次考虑这个问题。