【问题标题】:How call a maven plugin explicitly and non running otherwise?如何显式调用 maven 插件而不运行?
【发布时间】:2016-02-09 12:57:32
【问题描述】:

最终我生成了一些带有显式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>-->

【问题讨论】:

  • 你为什么要这样做?这很奇怪。要compile 您的代码,您必须首先生成源代码。
  • mvn compile处重新生成代码有什么问题?通常整个构建过程都需要生成的代码,然后调用generate-sources 很有用。
  • 如果您想在构建生命周期之外运行插件,您可以尝试: 1. 将阶段设置为无; 2.mvn cxf-codegen-plugin:&lt;the-goal-name&gt;
  • 试过mvn org.apache.cxf:cxf-codegen-plugin:wsdl2java - “没有什么可以生成”我被告知。
  • @PavelVlasov 这可能是因为您的配置在执行中,而不是作为命令行执行的通用配置。顺便问一下,您使用的是哪个版本的 Maven?

标签: java maven maven-3 pom.xml maven-plugin


【解决方案1】:

您可以从命令行运行任何插件,因此只运行它(在这种情况下,不是 Maven 阶段的一部分),只需在您的 POM(插件部分)中使用通用配置(不嵌套在任何执行小节)。

因此,给定的配置将用于任何执行。由于相关插件没有通过任何 Maven packaging 的任何默认 binding(相反,其他插件会发生这种情况,即 Maven 编译器或 Surefire 插件),因此配置将仅由您的命令行执行获取。

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 时,您正在执行一个阶段以及任何其他preceding phase。但是,前面的阶段不会影响您的项目,因此您将获得相同的行为,以及将其作为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,您可以从命令行(指定所需的执行 ID)调用简单的插件执行(这次保持绑定到 none 阶段),如下所示:

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

上面的命令只会(并且只会)执行你的目标执行。

【讨论】:

  • @PavelVlasov 有帮助吗?
猜你喜欢
  • 1970-01-01
  • 2019-04-09
  • 1970-01-01
  • 1970-01-01
  • 2021-10-11
  • 2018-05-26
  • 2015-12-19
  • 2021-09-08
  • 1970-01-01
相关资源
最近更新 更多