【发布时间】:2012-05-02 00:04:35
【问题描述】:
我找不到好的、可扩展的解决方案的问题:
我有一个项目可以提供给定工件的多种风格。这是一个多模块项目,目前有 3 个模块:
- /flavor1_module
- /flavor2_module
- /flavor3_module
问题是我还有另外 50 个项目需要以相同的方式设置,即提供 3 种风格。
考虑的解决方案:
- 将已创建的多模块项目变成所有其他 50 个项目的父项目
- 缺点:它只是不起作用。保存在父模块中的指令不会被继承,因此它们不会被执行。
- 使用maven-archetype-plugin创建a multi-module project
template,然后根据模板创建全部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 中变成了incompatible。
maven-invoker-plugin 看起来仍然很有希望。该插件最初旨在运行集成测试,但可以使用它来扩展例如编译阶段。 但它要求将子 pom.xml-s 视为资源并即时修改。对于我在此处描述的问题,解决方案将过于复杂且不稳定。我更喜欢在构建 maven 模型时可以在内存中运行的更轻量级的东西。
所以现在我使用配置文件,试图使它们尽可能紧凑。可能过一段时间我需要重新考虑一下这个问题。
【问题讨论】:
-
这是否意味着不同风格的工件在配置文件中有所不同,还是在更重要的部分有所不同?
-
目前它们在配置文件和打包格式上有所不同。很快就会出现更多差异。
-
嗯。包装?您的意思是要将多个类打包为 jar,然后打包到 .tar.gz 中,或者您所说的打包格式是什么意思?还是只是包的结构?
-
每种风格都适用于不同的客户,他们收到的应用程序包含不同的资源子集。根据客户的不同,内部也有针对不同架构编译的原生部分。
-
@LukaszGuminski 很有趣,但我在 1.0 版的 maven-reactor-plugin 上看不到目标注入模块,这似乎是最新的。即使这样有效,您仍然需要手动创建这些模块吗?
标签: maven pom.xml multi-module