如何显式调用Maven插件且不运行其他插件?

6
最终,我使用明确的mvn generate-sources生成了一些Java代码,该命令调用了pom.xml中定义的CXF插件。 问: 如何配置插件以使其在显式调用时运行并且不进行其他操作时不运行?
如果我将phase设置为generate-sources,那么mvn generate-sources可以正常工作,但是mvn compile也会触发它(这是不需要的)。
如果我将phase设置为none,那么mvn generate-sources不会执行任何操作(不需要),但是mvn compile也不会触发它(可以接受)。
<plugin>
    <groupId>org.apache.cxf</groupId>
    <artifactId>cxf-codegen-plugin</artifactId>
    <version>${cxf.version}</version>
    <executions>
        <execution>
            <id>generate-sources</id>
            <phase>generate-sources</phase>
            <!--<phase>none</phase>-->

你为什么想要这样做?这很奇怪。要编译你的代码,你必须首先生成源代码。 - Tunaki
如果在“mvn compile”时重新生成代码,会出现什么问题?通常情况下,生成的代码需要用于完整的构建过程,因此调用“generate-sources”非常有用。 - Ferrybig
1
如果你想在构建生命周期之外运行插件,可以尝试以下步骤:1. 将阶段设置为none;2. mvn cxf-codegen-plugin:<目标名称> - Joao Morais
尝试过 mvn org.apache.cxf:cxf-codegen-plugin:wsdl2java - 被告知 "没有要生成的内容"。 - Pavel Vlasov
@PavelVlasov 这可能是因为您的配置是在执行中而不是作为命令行执行的通用配置。顺便问一下,您使用的是哪个版本的Maven? - A_Di-Matteo
1个回答

18

您可以从命令行运行任何插件,因此独立地运行它(不是作为Maven阶段的一部分),只需在POM文件中配置插件(plugins部分)具有通用配置(不嵌套在任何execution子部分内)。

因此,所给定的配置将用于任何执行。由于涉及的插件没有任何默认binding(而其他插件,如Maven编译器或Surefire插件,则会通过任何Maven packaging进行绑定),因此该配置仅会被您的命令行执行所使用。

mvn org.apache.cxf:cxf-codegen-plugin:wsdl2java 

接下来会运行你在POM中配置的插件,并使用所需的配置。

<plugin>
    <groupId>org.apache.cxf</groupId>
    <artifactId>cxf-codegen-plugin</artifactId>
    <version>${cxf.version}</version>
    <configuration><!-- HERE YOUR CONFIG --></configuration>
</plugin>

正如您所看到的,插件没有描述执行(因此也没有阶段),但提供了全局配置。作为全局配置,它将被命令行执行使用。
这种方法与您尝试的略有不同:
mvn generate-sources

执行generate-sources时,您正在执行一个阶段,因此也会执行任何其他前置阶段。但是,前面的阶段不会影响您的项目,因此您将获得相同的行为,以及作为compile阶段的一部分的副作用。
如果您真的希望将其作为generate-sources阶段的一部分(无论出于何种原因),并且继续运行mvn generate-sources而不会出现上述副作用,则可以将其包装在profile中,并将其添加到您的POM中。
<profiles>
   <profile>
      <id>generate-cxf</id>
      <build>
         <defaultGoal>generate-sources</defaultGoal>
         <plugins>
           <plugin>
                <groupId>org.apache.cxf</groupId>
                <artifactId>cxf-codegen-plugin</artifactId>
                <version>${cxf.version}</version>
                <executions><!-- HERE YOUR EXECUTIONS--></executions>
            </plugin>
         </plugins>
      </build>
     </profile>
</profiles>

你可以执行以下操作:

mvn generate-sources -Pgenerate-cxf

它将激活上面的配置文件以及您的插件和执行,但不会影响(副作用)任何其他阶段或默认构建。

此外,通过defaultGoal element配置,您甚至可以简单地调用:

mvn -Pgenerate-cxf

您将会得到完全相同的行为(虽然我会说有点神秘)。


最后但并非最不重要的是,自从Maven 3.3.1以来,你可以通过命令行调用简单的插件执行(这次保持绑定到none阶段),指定所需的执行id如下:

    mvn org.apache.cxf:cxf-codegen-plugin:VERSION_HERE:wsdl2java:@EXEC_ID_HERE

上述命令仅会执行目标执行文件。

@PavelVlasov 这有帮助吗? - A_Di-Matteo

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接