如何在不同的POM文件之间共享POM片段

8

我目前在处理Maven方面有些困难:我的项目由几个嵌套模块组成,对于其中一些模块,POM文件中存在类似的配置。

我希望把它整理得更清晰。实际上,我想定义一个“可运行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中定义一个配置文件,并通过测试文件的存在来在某些子模块中激活它。参见这个相关问题。但我面临的问题是未正确继承/设置{basedir}属性。
我认为需要使用hack来完成如此基本(常规)的任务非常令人惊讶。你通常如何在Maven中处理这个问题?
4个回答

6
我刚刚发现了一些可以解决我的问题的东西:

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

子模块的关系是不同的概念。
您可以通过使用relativePath属性(如文档中所述)指定一个不是实际父文件夹的父POM模块。
在我的情况下,我使用以下布局:
  • main-project
    • utils (parent:main-project)
    • cli-programs (parent:main-project)
      • generic-cli (parent:cli-programs; Dummy & empty POM module)
      • cli-1 (parent:generic-cli)
      • cli-2 (parent:generic-cli)
然后,在generic-cli/pom.xml中,我可以声明适用于所有CLI程序的配置(例如自定义测试套件、可运行JAR包等)。

5

有一种方法可以实现这个,就是在多模块项目的父pom文件中声明<pluginManagement>代码,并将<plugin>代码放在其中。然后各个模块可以有一个<plugin>部分,可以使用此内容而无需重新声明。

父pom:

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

子POM:

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

不错。我之前并不知道这个可能性。 - Raphael Jolivet

1

Maven-tiles 可以解决这个问题。它也在 maven 3.x 的路线图上,在这里 进行跟踪。


0

虽然不是完整的答案,但解决basedir问题的方法是使用模块的通用布局,例如root/modules/moduleA root/modules/moduleB。

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接