【问题标题】:How to share POM fragments between different POMs如何在不同的 POM 之间共享 POM 片段
【发布时间】:2011-01-11 16:12:48
【问题描述】:

我目前正在为 Maven 苦苦挣扎:我有一个由多个嵌套模块组成的复杂项目,对于其中一些模块,我在 POM 中有类似的配置。

我想让它干净。其实我想定义一个“runnable-jar”通用配置,并在一些模块中激活它。

这是我想在几个项目之间分享的 POM 片段:

<build>
    <plugins>
       <plugin>

        <artifactId>maven-assembly-plugin</artifactId>
        <configuration>

            <!-- Use a custom descriptor, with suffix "bin" -->
            <descriptors>
                <descriptor>src/main/assembly/runnable-jar-assembly.xml</descriptor>
            </descriptors>

            <!-- Add main class to manifest -->
            <archive>
                <manifest>
                    <mainClass>${mainClass}</mainClass>
                </manifest>
            </archive>

        </configuration>

        <!-- Add build of this package to lifecycle -->
        <executions>
            <execution>
                <id>make-runnable-jar</id>
                <phase>package</phase>
                <goals>
                    <goal>single</goal>
                </goals>
            </execution>
        </executions>

       </plugin>
    </plugins>
</build>

在某些 POMS 中,我希望能够执行以下操作:

<!-- Set the main class -->
<properties>
    <mainClass>my.main.Class</mainClass>
</properties>

<!-- Activate runnable jar build -->
<import>src/main/pom/runnable-jar-pom.xml</import> 

我已经寻找了一种将一些 XML 片段导入 POM 或定义整个 XML 节点集宏的方法。

对于我所发现的,最接近的解决方案是在父 POM 中定义一个配置文件,并通过测试文件的存在来在某些子模块中激活它。 See this related question。但我面临{basedir} 属性未正确设置继承/设置的问题。

我发现需要一个 hack 来做一些如此基本的事情(=通常)是非常令人惊讶的。在 Maven 中你通常如何处理这个问题?

【问题讨论】:

    标签: maven profile pom.xml


    【解决方案1】:

    我刚刚发现了一些可以解决我的问题的方法:

    模块不需要是其父模块的子模块。

    父模块子模块关系是独立的概念。

    您可以使用 relativePath 属性 (as explained in the doc)

    指定不是文件夹结构中实际父文件夹的父 POM 模块

    就我而言,我使用以下布局:

    • 主项目
      • utils(父级:主项目
      • cli-programs(父级:主项目
        • generic-cli(父级:cli-programs;虚拟和空 POM 模块)
        • cli-1(父级:generic-cli
        • cli-2(父级:generic-cli

    然后,在generic-cli/pom.xml 中,我可以声明一个所有 cli 程序通用的配置(如自定义测试套件、runnable-jar 打包等)。

    【讨论】:

      【解决方案2】:

      一种方法是在多模块项目的父 pom 的 &lt;pluginManagement&gt; 中声明您的 &lt;plugin&gt; 代码。然后各个模块可以有一个&lt;plugin&gt; 部分,它可以在不重新声明内容的情况下使用它。

      父pom:

      <pluginManagement>
          <plugins>
              <plugin>
                  <groupId>org.apache.maven.plugins</groupId>
                   <artifactId>maven-assembly-plugin</artifactId>
                    ... all the details...
               </plugin>
               ...
           </plugins>
      </pluginManagement>
      

      孩子们:

           <plugins>
              ...
              <plugin>
                  <groupId>org.apache.maven.plugins</groupId>
                  <artifactId>maven-assembly-plugin</artifactId>
              </plugin>
           </plugin>
      

      【讨论】:

      • 不错。我不知道这种可能性。
      【解决方案3】:

      Maven-tiles 解决了这个问题。它也在 maven 3.x 的路线图上,跟踪 here

      【讨论】:

        【解决方案4】:

        不是一个完整的答案,而是基于问题的解决方案是使用模块的通用布局,例如root/modules/moduleA root/modules/moduleB。

        您不能再从它们自己的目录构建模块,只能通过父项目。但您可以使用配置文件。

        【讨论】:

          猜你喜欢
          • 2011-05-07
          • 1970-01-01
          • 2020-07-31
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多