我看到了this question,它激励我再次查看motivated (没有成功),寻找声明配置的替代方法,以便将其附加到父POM的配置中,而不是覆盖它。在Maven POM中,如果配置声明了与父配置相同的元素,它将覆盖父配置。正如另一个问题的公认答案所说,这是预期的行为。
但这并不总是我们想要的行为。在Maven中是否应该有添加而不是覆盖配置的方法?
例如:-提供声明配置最终元素的能力,以便子项可以添加到这些元素中,但不能替换?-允许子项配置将元素声明为添加,以便与父项合并
aspectj-maven-plugin的aspectLibraries元素就是一个很好的例子,说明覆盖行为并不总是可取的。
在我的父POM中,我为aspectj插件定义了一个配置,它声明了一个要用作aspectLibrary的跟踪jar。
<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的配置,但这涉及到维护,如果我想在配置文件中声明跟踪配置,以便在需要时禁用它(我确实这样做了),那么我需要在子POM中重新实现该配置文件。
上述示例中的依赖项声明与父级和其他位置中的其他依赖项声明合并。我知道依赖是一种特殊情况,但它表明实现它是可行的。
发布于 2009-07-10 03:03:54
Sonatype在blog post中解释了这一点。
在父pom中,指定
<configuration>
<aspectLibraries combine.children="append">
<aspectLibrary>
<groupId>name.seller.rich</groupId>
<artifactId>tracing</artifactId>
</aspectLibrary>
</aspectLibraries>
</configuration>
通常,子插件的配置元素将覆盖父插件中指定的配置元素。这在默认情况下使事情变得简单:一个完全配置的子节点将使用它的pom中的配置。但是,父级可以通过在所需的配置元素上使用combine.children="append“设置来强制列表应该被扩展而不是替换。
发布于 2009-07-09 19:28:40
我需要对此进行测试,所以让我回到您的讨论中,但我认为正确的方法是使用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>
但是,我认为您可能会要求提供附加配置的功能,以便在父配置的基础上,在子节点的配置中添加一个额外的节点。对于这种情况,我想不出一个明显的解决方案。
https://stackoverflow.com/questions/1102369
复制相似问题