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

Rap*_*vet 8 profile pom.xml maven

我目前正在努力使用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>
Run Code Online (Sandbox Code Playgroud)

在某些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> 
Run Code Online (Sandbox Code Playgroud)

我已经搜索了将一些XML片段导入POM或者定义整个XML节点集宏的方法.

对于我所发现的,最接近的解决方案是在父POM中定义一个配置文件,并通过测试文件的存在在一些子模块中激活它.看到这个相关的问题.但我面临的问题是{basedir}属性没有被正确设置为继承/设置.

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

Rap*_*vet 6

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

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

模块子模块关系是单独的概念.

您可以使用relativePath属性指定不是文件夹结构中实际父文件夹的父POM模块(如文档中所述)

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

  • 主要项目
    • utils(parent:main-project)
    • cli-programs(parent:main-project)
      • generic-cli(parent:cli-programs ; Dummy&empty POM模块)
      • cli-1(父母:generic-cli)
      • cli-2(父母:generic-cli)

然后,generic-cli/pom.xml我可以声明一个对我所有cli程序都很常见的配置(比如自定义测试套件,runnable-jar包装等).


Rag*_*ram 5

一种方法是在多模块项目的父pom中声明<plugin>代码<pluginManagement>.然后,各个模块可以具有<plugin>可以使用该部分而无需重新声明内容的部分.

父母pom:

<pluginManagement>
    <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
             <artifactId>maven-assembly-plugin</artifactId>
              ... all the details...
         </plugin>
         ...
     </plugins>
</pluginManagement>
Run Code Online (Sandbox Code Playgroud)

儿童poms:

     <plugins>
        ...
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-assembly-plugin</artifactId>
        </plugin>
     </plugin>
Run Code Online (Sandbox Code Playgroud)