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

时间:2011-01-11 16:12:48

标签: maven profile pom.xml

我目前正在努力使用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}属性没有被正确设置为继承/设置。

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

4 个答案:

答案 0 :(得分:6)

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

  

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

子模块关系是不同的概念。

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

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

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

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

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

答案 1 :(得分:5)

执行此操作的一种方法是在多模块项目的父pom的<plugin>内声明<pluginManagement>代码。然后,各个模块可以有一个<plugin>部分,可以使用它而无需重新声明内容。

父母:

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

儿童poms:

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

答案 2 :(得分:0)

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

您无法再通过thr父项目构建自己的目录模块。但您可以使用配置文件。

答案 3 :(得分:0)

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