【问题标题】:Augmenting instead of overriding Maven configuration增强而不是覆盖 Maven 配置
【发布时间】:2009-07-09 07:34:05
【问题描述】:

我看到了this question,它促使我再次(但没有成功)查看 Maven 配置,寻找另一种声明配置的方法,以便将其附加到父 POM 的配置中,而不是覆盖它。 在 Maven POM 中,如果配置声明了与父级相同的元素,它将覆盖父级配置。正如另一个问题的公认答案所说,这是预期的行为。

但这并不总是期望的行为。 Maven 中是否应该/是否有一种方法可以添加而不是覆盖配置?

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


对于 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>

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

请注意,我有解决此特定问题的方法,我对一般情况和对 Maven 的影响感兴趣。

简单的答案是在子 POM 和新 jar 中重新声明跟踪 jar 的配置,但这会影响维护,如果我想在配置文件中声明跟踪配置,以便可以禁用它如果需要(我这样做),然后我需要在孩子中重新实现配置文件。

上述示例中的依赖声明与父级和其他地方的其他依赖声明合并。我知道依赖是一个特例,但它表明它是可行的。

【问题讨论】:

    标签: java maven-2


    【解决方案1】:

    Sonatype 在blog post 中对此进行了解释。

    在父pom中,指定

    <configuration>
      <aspectLibraries combine.children="append">
        <aspectLibrary>
          <groupId>name.seller.rich</groupId>
          <artifactId>tracing</artifactId>
        </aspectLibrary>
      </aspectLibraries>
    </configuration>
    

    一般来说,子元素的配置元素将覆盖任何给定插件在父元素中指定的元素。默认情况下,这使事情变得简单:完全配置的孩子将完全使用其 pom.xml 中的配置。但是,父级可以通过在所需配置元素上使用 combine.children="append" 设置来强制扩展而不是替换列表。

    【讨论】:

    • 感谢 Zac 的帮助。可能值得澄清您的回复,以表明这是所有配置列表中的通用功能,而不是特定于 aspectLibraries
    • 已按建议更新。如果这种行为在未来的 maven 版本中发生变化,希望知道的人会更新 maven 用户常见问题解答。
    【解决方案2】:

    我需要对此进行测试,所以让我回复您,但我认为正确的方法是使用properties,如here 所述。在您的情况下,代码如下所示:

    <properties>
      <aspect.library.groupId>name.seller.rich</aspect.library.groupId>
      <aspect.library.artifactId>tracing</aspect.library.artifactId>
    </properties>
    
    <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>${aspect.library.groupId}</groupId>
             <artifactId>${aspect.library.artifactId}</artifactId>
           </aspectLibrary>
         </aspectLibraries>
       </configuration>
       <dependencies>
         <dependency>
           <groupId>aspectj</groupId>
           <artifactId>aspectjtools</artifactId>
           <version>1.5.3</version>
         </dependency>
       </dependencies>
    </plugin>
    

    然后,您可以在子级中更改这些属性,而父级会自动获取新值:

    <properties>
      <aspect.library.groupId>name.seller.rich</aspect.library.groupId>
      <aspect.library.artifactId>something-else</aspect.library.artifactId>
    </properties>
    

    但是,我认为您可能要求能够附加配置,以便在您的孩子的配置中在您的父母指定的节点之上有一个额外的节点。对于这种情况,我想不出一个明显的解决方案。

    【讨论】:

      猜你喜欢
      • 2012-03-07
      • 1970-01-01
      • 1970-01-01
      • 2019-12-22
      • 2013-03-26
      • 1970-01-01
      • 2011-01-11
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多