从maven 文档 中获取的信息:
pluginManagement:与插件一起使用的元素。Plugin Management 包含插件元素,配置方式类似,但不同之处在于,它旨在为继承自此项目的项目构建配置,并非为此特定项目构建配置插件信息。然而,这仅配置实际在子项目中 plugins 元素中引用的插件。子项目有权覆盖 pluginManagement 定义。
现在问题是:如果我在我的父 POM 中有这个内容
<build>
<pluginManagement>
<plugins>
<plugin>
<artifactId>maven-dependency-plugin</artifactId>
<version>2.0</version>
<executions>
Some stuff for the children
</execution>
</executions>
</plugin>
</plugins>
</pluginManagement>
</build>
当我在父项目上运行mvn help:effective-pom时,我得到了我想要的结果,即build下直接的插件部分(执行工作的部分)为空。
现在,如果我执行以下操作:
<build>
<pluginManagement>
<plugins>
<plugin>
<artifactId>maven-dependency-plugin</artifactId>
<version>2.0</version>
<executions>
Some stuff for the children
</execution>
</executions>
</plugin>
</plugins>
</pluginManagement>
<plugins>
<plugin>
<artifactId>maven-compiler-plugin</artifactId>
<version>2.0.2</version>
<inherited>true</inherited>
<configuration>
<source>1.6</source>
<target>1.6</target>
</configuration>
</plugin>
</plugins>
</build>
使用mvn help:effective-pom命令后,我得到了我想要的内容,插件中只包含已声明的内容,而pluginManagement部分被忽略。
但是当进行以下更改时
<build>
<pluginManagement>
<plugins>
<plugin>
<artifactId>maven-dependency-plugin</artifactId>
<version>2.0</version>
<executions>
Some stuff for the children
</execution>
</executions>
</plugin>
</plugins>
</pluginManagement>
<plugins>
<plugin>
<artifactId>maven-dependency-plugin</artifactId>
<version>2.0</version>
<inherited>false</inherited> <!-- this perticular config is NOT for kids... for parent only -->
<executions>
some stuff for adults only
</execution>
</executions>
</plugin>
</plugins>
</build>
运行 mvn help:effective-pom,插件管理部分的内容将会添加在已经声明的内容之上。因此:
<build>
<pluginManagement>
...
</pluginManagement>
<plugins>
<plugin>
<artifactId>maven-dependency-plugin</artifactId>
<version>2.0</version>
<inherited>false</inherited> <!-- this perticular config is NOT for kids... for parent only -->
<executions>
Some stuff for the children
</execution>
<executions>
some stuff for adults only
</execution>
</executions>
</plugin>
</plugins>
</build>
有没有一种方法可以从父POM的“section”中排除子级部分?实际上,我想要的是pluginManagement的行为与文档所述完全一致,也就是说,我只希望它适用于子级,而不适用于声明它的项目。此外,是否有一种方法可以通过在项目的普通构建部分声明插件来覆盖pluginManagement中的部分?无论我尝试什么,都会得到添加了该部分以执行操作,但我无法覆盖已经存在的部分。
编辑:
我从未找到过可接受的解决方案,因此问题仍然存在。最接近的解决方案是下面提供的解决方案,目前是该问题的已接受解决方案,直到出现更好的解决方案。现在有三种方法可以实现所需的结果(根据当前POM在继承层次结构中的位置调节插件行为):
1-使用配置文件,这将起作用,但您必须注意配置文件不会被继承,这有点违反直觉。如果激活,它们将应用于声明配置文件的POM,然后将此生成的POM传播下去。因此,激活配置文件的唯一方法是在命令行上明确指定它(至少我没有找到其他方法)。属性、文件和其他激活方式无法激活POM,因为触发器不在声明配置文件的POM中。
2 - (这是我最终采取的做法)在父级中声明插件为非继承性,并在每个想要的子级中重新声明(复制-粘贴)该块内容。虽然不理想,但它很简单并且起作用。
3-拆分父POM的汇总特性和父特性。然后,由于仅适用于父级的部分位于不同的项目中,现在可以像最初打算的那样使用pluginManagement。然而,这意味着必须创建一个新的人工项目,它不会对最终产品产生贡献,只服务于云系统。这是一个明显的概念渗漏情况。此外,这只适用于我的特定情况,难以推广,因此我放弃了尝试使其工作的努力,转而使用不太美观但更加清晰的剪切和粘贴补丁(如2所述)。
如果看到这个问题的任何人都有更好的解决方案,无论是因为我对Maven的认识不足还是因为工具已经发展到允许这样做,请在此发布解决方案以供将来参考。
感谢大家的帮助 :-)