7

我找不到一个好的、可扩展的解决方案的问题:

我有一个项目可以提供给定工件的多种风格。这已被设置为一个多模块项目,目前有 3 个模块:

  • /flavor1_module
  • /flavor2_module
  • /flavor3_module

问题是我还有另外 50 个项目需要以相同的方式设置,即提供 3 种风格。

考虑的解决方案:

  1. 将已经创建的多模块项目变成所有其他 50 个项目的父项目
    • 缺点:它只是不起作用。保存在父模块中的指令不会被继承,因此它们不会被执行。
  2. 使用maven-archetype-plugin创建一个多模块项目模板,然后基于该模板创建全部 50 个项目
    • 缺点:如果我需要 flavor4,我需要手动更新所有 50 个项目以添加 flavor4_module(并复制其内容)。不可扩展。
  3. 将所有风味的配置嵌入到单个 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 模型时可以在内存中运行的更轻量级的东西。

所以现在我使用配置文件,试图使它们尽可能紧凑。可能在一段时间内,我需要再次考虑这个问题。

4

4 回答 4

1

现在您可以使用maven-tiles插件来获得所需的行为。

使用 maven-tiles,您可以在不同的 pom 中定义构建行为并将它们导入到您喜欢的任何位置。

MNG-5102附有一个工作示例--> daddy3.zip

Maven 的仅限继承的紧身衣现已正式删除。

于 2012-10-02T20:14:42.133 回答
0

根据我的经验,选项 3效果最好,但我不必像你需要的那样扩展它——当我不得不这样做时,我使用了 maven-ant-plugin 创建了一个参数化的 ant 脚本来做定制。它有一些缺点——即同时使用 ant 和 maven,因此实际的 POM 更难以理解,但它确实比 maven 提供了更大的灵活性。

于 2012-07-07T00:29:56.580 回答
0

在我看来,您可以为此创建多个不同的程序集描述符,并配置多个插件执行,每个执行引用不同的描述符。您必须将项目维护为单个模块而不是多模块项目。如果您的发行版包含相同的类集但不同的资源或库,它就可以工作。

        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-assembly-plugin</artifactId>
            <version>2.2.1</version>
            <executions>
                <execution>
                    <goals>
                        <goal>single</goal>
                    </goals>
                    <id>assembly</id>
                    <phase>package</phase>
                    <configuration>
                        <descriptors>
                                <descriptor>one.xml</descriptor>
                        </descriptors>
                    </configuration>
                </execution>
                <execution>
                    <goals>
                        <goal>single</goal>
                    </goals>
                    <id>assembly</id>
                    <phase>package</phase>
                    <configuration>
                        <descriptors>
                                <descriptor>two.xml</descriptor>
                        </descriptors>
                    </configuration>
                </execution>
                <execution>
                    <goals>
                        <goal>single</goal>
                    </goals>
                    <id>assembly</id>
                    <phase>package</phase>
                    <configuration>
                        <descriptors>
                                                      <descriptor>three.xml</descriptor>
                        </descriptors>
                    </configuration>
                </execution>
            </executions>
        </plugin>

您可以创建一个父 pom,并在那里配置装配 pluing,以便您可以从那里控制分发的数量和包装的变化。您的项目不需要了解不同包装的细节。

我强烈建议将本机库保留为单独的模块,并使用存储库机制将已编译的库安装到其中。您可以使用不同的分类器来隔离平台,例如,

mylib-2.0.0-win32_x86.dll
mylib-2.0.0-linux_x86.so
mylib-2.0.0-linux_x86_64.so

然后,您可以将这些库作为项目中的依赖项引用,然后能够将它们与您的发行版一起打包。

整体解决方案将在很大程度上取决于各种发行版的差异以及打包发行版的整体过程,但我认为这会奏效。

最终且更具可扩展性的解决方案是通过实施 Maven 插件来创建自己的打包。

于 2012-04-21T13:04:48.483 回答
-1

If you are using maven 3, you can define profiles the parent pom and activate them base on file existance. On the child modules you can "inherit flavours" by simply creating empty files.

This is better documented on the links below:

于 2012-08-01T15:14:08.213 回答