9

是否可以在已停用的父 POM 中定义一个插件,并且当孩子继承此插件时它会自动激活?

4

6 回答 6

10

我猜你想在你的父 pom 中配置插件,但只在继承的项目中使用它。Maven 对此有一个部分 - 在 pluginManagement 中配置您的插件,但仅在需要时将它们绑定到阶段,例如在 pluginManagement 中省略阶段标记,但在继承的 pom 中指定它。

于 2009-03-10T14:44:36.740 回答
9

所以'siddhadev'是完全正确的。您可以使用给定的 id 在父 pom 中定义插件配置:

<build>
    <pluginManagement>
        <plugins>
            <plugin>
                <artifactId>maven-antrun-plugin</artifactId>
                <executions>
                    <execution>
                        <id>child-caller</id>
                        <!-- 'phase' omitted -->
                        <goals>
                            <goal>run</goal>
                        </goals>
                        <configuration>
                            <tasks>
                                <echo message="called from child!" />
                            </tasks>
                        </configuration>
                    </execution>
                </executions>
            </plugin>
        </plugins>
    </pluginManagement>
</build>

而且,在子 POM 中,您可以明确列出应该调用它的阶段:

<build>
    <plugins>
        <plugin>
            <artifactId>maven-antrun-plugin</artifactId>
            <executions>
                <execution>
                    <id>child-caller</id>
                    <phase>compile</phase>
                </execution>
            </executions>
        </plugin>
    </plugins>
</build>

我用它来定位各种 JRE。不幸的是,因为您不能将 maven-compiler-plugin 用于不同的目标目录(我认为这是插件中的一个错误),所以您必须使用 Ant。

于 2009-08-10T18:06:23.397 回答
6

这不完全是你所追求的,但我认为它对你来说足够好。

如果您在父项的 pluginManagement 标记中声明插件,则配置将由声明该插件的任何子项目继承。

例如,在父声明中编译插件使用 Java 5 进行测试编译。

<pluginManagement>
  <plugins>
    <plugin>
      <groupId>org.apache.maven.plugins</groupId>
      <artifactId>maven-compiler-plugin</artifactId>
      <executions>
        <execution>
          <id>test-compile</id>
          <goals>
            <goal>testCompile</goal>
          </goals>
          <configuration>
            <source>1.5</source>
            <target>1.5</target>
          </configuration>
        </execution>
      </executions>
    </plugin>
  </plugins>
</pluginManagement>

然后在一个孩子中,您简单地声明编译器插件,并且将继承父级的配置:

<build>
  <plugins>
    <plugin>
      <groupId>org.apache.maven.plugins</groupId>
      <artifactId>maven-compiler-plugin</artifactId>
    </plugin>
  </plugins>
</build>
于 2009-07-30T22:20:22.427 回答
4

您可以在顶级 pom 中声明一个插件并告诉它被跳过,然后告诉它不要在子级别被跳过。它不是完全自动的,但覆盖冗长程度非常小。

父 Pom,禁用插件,但声明所有配置:

<plugin>
    <groupid>org.apache.maven.plugins</groupid>
    <artifactid>maven-surefire-plugin</artifactid>
    <configuration>
        <skip>true</skip>
        ...lots more config...
        ...lots more config...
        ...lots more config...
    </configuration>
</plugin>

Child Pom,启用插件:

<plugin>
    <groupid>org.apache.maven.plugins</groupid>
    <artifactid>maven-surefire-plugin</artifactid>
    <configuration>
        <skip>false</skip>
    </configuration>
</plugin>
于 2009-02-16T18:08:01.610 回答
4

我采用了以下解决方案:

  • 在 pluginManagement-section 的 parent-pom 中配置插件。将插件绑定到现有阶段。

  • 通过将其绑定到不存在的阶段来停用父 pom 的插件:覆盖插件部分中的阶段。

  • 通过在插件部分中包含插件来激活每个子 pom 中的插件。

示例父-pom:

<defaultGoal>install</defaultGoal>
    <pluginManagement>
        <plugins>
            ...
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-install-plugin</artifactId>
                <executions>
                    <execution>
                        <id>install-ejb-client</id>
                        <phase>install</phase>
                        <goals>
                        <goal>install-file</goal>
                        </goals>
                        <configuration>
                            <file>${ejb-client-file}</file>
                            <groupId>${project.groupId}</groupId>
                            <artifactId>${project.artifactId}</artifactId>
                            <version>${project.version}</version>
                            <packaging>jar</packaging>
                            <classifier>client</classifier>
                        </configuration>
                    </execution>
                </executions>
            </plugin>
                    ...                 
        </plugins>
    </pluginManagement>
    <plugins>
            <plugin>
                <!-- deactivate the plugin for this project, only child-projects do generate ejb-clients -->
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-install-plugin</artifactId>
                <inherited>false</inherited>
                <executions>
                    <execution>
                        <id>install-ejb-client</id>
                        <phase>none</phase>
                    </execution>
                </executions>
            </plugin>
            ...
    </plugins>
</build>

示例子 pom:

<build>
    <plugins>
            ...
        <plugin>
            <!-- Install the generated client-jar. Property 'ejb-client-file' has to be set! Plugin configuration is in the parent pom -->
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-install-plugin</artifactId>
        </plugin>       
            ... 
    </plugins>
</build>
于 2009-08-18T10:03:17.093 回答
1

据我所知,没有通用的解决方案。至少目前...

一个想法(我没有尝试过,但它可能有效)是在父 pom.xml 中定义一个不存在的执行目标,例如:

<executions>
    <execution>
        <goals>
            <goal>noGoal</goal>
        </goals>
    </execution>
</executions>

在每个孩子身上,你重新定义了一个正确的目标。

这个解决方案的问题(如果它有效,当然;))是您必须为每个孩子重新定义插件配置。否则,它不会被执行。

于 2009-01-30T12:17:27.240 回答