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

有帮助吗?

解决方案

我猜你想配置你的父POM的插件,但只有在继承的项目中使用它。 Maven有此一节 - 配置pluginManagement你的插件,但将它们绑定到一个阶段只是当你需要它,例如省略pluginManagement相位标记,但下你继承POM指定它。

其他提示

所以 '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-编译器插件具有不同的目标目录(我考虑在插件错误),您必须使用Ant。

这不正是你追求的,但我认为它会工作的很好,你。

如果您在声明中父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>

您可以声明在顶层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>

子POM,使插件:

<plugin>
    <groupid>org.apache.maven.plugins</groupid>
    <artifactid>maven-surefire-plugin</artifactid>
    <configuration>
        <skip>false</skip>
    </configuration>
</plugin>

我采用了以下解决方案:

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

  • 通过将parent-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>

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

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

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

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

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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top