来自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/

10-15 13:46