扩充而不是覆盖Maven配置

Ric*_*ler 19 java maven-2

我看到了这个问题,它促使我再次在Maven配置中查找(没有成功)另一种声明配置的方法,因此它被附加到父POM的配置而不是覆盖它.在Maven POM中,如果配置声明与父节点中相同的元素,则它将覆盖父节点配置.正如另一个问题所接受的答案所说,这是预期的行为.

但这并不总是理想的行为.在Maven中是否存在添加而不是覆盖配置的方法?

例如: - 提供声明配置final元素的能力,以便孩子可以添加但不能替换? - 允许子配置将元素声明为添加元素,因此它与父元素合并


对于覆盖行为并不总是需要的一个很好的例子是aspectj-maven-plugin的aspectLibraries元素.

在我的父POM中,我为aspectj插件定义了一个配置,该配置声明了一个跟踪jar用作aspectLibrary.

 <plugin>
   <groupId>org.codehaus.mojo</groupId>
   <artifactId>aspectj-maven-plugin</artifactId>
   <executions>
     <execution>
     <id>compile_with_aspectj</id>
       <goals>
         <goal>compile</goal>
       </goals>
     </execution>
   </executions>
   <configuration>
     <aspectLibraries>
       <aspectLibrary>
         <groupId>name.seller.rich</groupId>
         <artifactId>tracing</artifactId>
       </aspectLibrary>
     </aspectLibraries>
   </configuration>
   <dependencies>
     <dependency>
       <groupId>aspectj</groupId>
       <artifactId>aspectjtools</artifactId>
       <version>1.5.3</version>
     </dependency>
   </dependencies>
</plugin>
Run Code Online (Sandbox Code Playgroud)

这是所有子项目继承的,我在所有项目中都有跟踪,这很好.但是,如果我在子POM中定义另一个aspectLibrary,它将替换我的跟踪配置.

注意我对这个特定问题有一个解决方法,我对Maven的一般情况和含义感兴趣.

简单的答案是重新声明子POM中的跟踪jar配置以及新jar,但是这会产生维护问题,如果我想在配置文件中声明跟踪配置,那么可以在需要时将其禁用(我做了),然后我需要重新实现孩子的个人资料.

上面示例中的依赖项声明与父级和其他位置中的其他依赖性声明合并.我知道依赖是一种特殊情况,但它表明它是可行的.

Zac*_*son 22

这在Sonatype 的博客文章中有所解释.

在父pom中,指定

<configuration>
  <aspectLibraries combine.children="append">
    <aspectLibrary>
      <groupId>name.seller.rich</groupId>
      <artifactId>tracing</artifactId>
    </aspectLibrary>
  </aspectLibraries>
</configuration>
Run Code Online (Sandbox Code Playgroud)

通常,子节点的配置元素将覆盖任何给定插件的父节点中指定的元素.默认情况下,这样可以保持简单:完全配置的子项将完全使用其pom中的配置.但是,父级可以强制应该扩展列表,而不是使用所需配置元素上的combine.children ="append"设置替换.

  • 谢谢,这对Zac来说是一个很好的帮助.可能值得澄清您的响应,以表明这是所有配置列表中的通用功能,而不是aspectLibraries特有的功能 (2认同)