来自Maven documentation
pluginManagement:是在侧面插件中可以看到的元素。插件管理包含插件元素的方式几乎相同,除了它不是为该特定项目构建配置插件信息,而是要配置从此继承的项目构建。但是,这仅配置在子级的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>
<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
pluginManagement部分中的内容将添加到已声明的内容之上。因此 :
<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的部分中排除孩子的部分?实际上,我想要的是pluginManagement完全按照文档说明的方式运行,也就是说,我希望它仅适用于子项,而不适用于声明其的项目。
作为一名杂技演员,有没有一种方法可以通过在项目的常规构建部分中声明插件来覆盖pluginManagement中的各个部分?无论我如何尝试,我都会将该部分添加到执行中,但是我无法覆盖已经存在的部分。
编辑:
我从来没有找到一个可以接受的解决方案,因此问题仍然悬而未决。下面提供了最近的解决方案,并且直到出现更好的解决方案为止,它是该问题的公认解决方案。现在,有三种方法可以达到所需的结果(根据当前POM在继承层次结构中的位置来调整插件的行为):
1-使用配置文件,它可以工作,但是您必须注意配置文件不会被继承,这有点违反直觉。将它们(如果已激活)应用于声明的POM,然后将该生成的POM向下传播。因此,激活子POM的配置文件的唯一方法是专门在命令行上(至少我没有找到其他方法)。属性,文件和其他激活方式无法激活POM,因为触发器不在声明配置文件的POM中。
2-(这是我最终要做的事情),声明插件在父级中未继承,并在需要它的每个孩子中重新声明(复制粘贴)花絮。不理想,但是它很简单并且可以正常工作。
3-拆分父POM的聚合性质和父性质。然后,由于仅适用于父项的部分位于另一个项目中,因此现在可以按最初的意图使用pluginManagement。但是,这意味着必须创建一个新的人工项目,该项目不会对最终产品有所贡献,而只会为罐头系统提供服务。这是概念性出血的明显案例。同样,这仅适用于我的具体情况,很难一概而论,因此我放弃了尝试使此工作变得更加努力的方法,而转而支持2中描述的不那么漂亮但包含更多的剪切和粘贴补丁。
如果遇到任何问题的人有更好的解决方案,要么是由于我缺乏对Maven的了解,要么是因为工具已发展为允许这样做,请在此处发布解决方案以供将来参考。
感谢大家的帮助 :-)
最佳答案
将插件配置添加到pluginManagement意味着,如果声明了插件,则将使用此配置,但是您仍然需要在要使用它的任何POM的build部分中声明该插件。
从您引用的部分中解释这一点的关键部分是:
但是,这只会配置子元素中plugins元素中实际引用的插件
因此,如果您在子pom中执行此操作,则将应用来自父pom的配置:
<build>
<plugins>
<plugin>
<artifactId>maven-dependency-plugin</artifactId>
</plugin>
</plugins>
</build>
更新:为了回答实际问题,pluginManagement部分中的内容始终与任何插件声明合并。为了避免父级执行此操作,可以在配置文件中定义pluginManagement部分,然后在子级项目上激活该配置文件,但不能在父级项目上激活该配置文件。然后,子项目将必须声明该概要文件。
例如:
<profiles>
<profile>
<id>for-children</id>
<build>
<pluginManagement>
<plugins>
<plugin>
<artifactId>maven-dependency-plugin</artifactId>
<version>2.0</version>
<executions>
<!--Some stuff for the children-->
</executions>
</plugin>
</plugins>
</pluginManagement>
</build>
</profile>
</profiles>
<build>
<plugins>
<plugin>
<artifactId>maven-dependency-plugin</artifactId>
<version>2.0</version>
<inherited>false</inherited> <!-- this perticular config is NOT for kids... for parent only -->
<!--some stuff for adults only-->
</executions>
</plugin>
</plugins>
</build>
关于maven-2 - Maven2-pluginManagement和父子关系的问题,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/1266226/