【发布时间】: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 的配置,但这会影响维护,如果我想在配置文件中声明跟踪配置,以便可以禁用它如果需要(我这样做),然后我需要在孩子中重新实现配置文件。
上述示例中的依赖声明与父级和其他地方的其他依赖声明合并。我知道依赖是一个特例,但它表明它是可行的。
【问题讨论】: