【问题标题】:How to run multiple plugin executions as a single argument to Maven?如何将多个插件执行作为 Maven 的单个参数运行?
【发布时间】:2023-01-12 23:59:59
【问题描述】:

是否可以运行全部<execution> 一个 Maven 命令的定义?

喜欢:

<build>
    <plugins>
        <plugin>
            <groupId>org.codehaus.mojo</groupId>
            <artifactId>exec-maven-plugin</artifactId>
            <executions>
                <execution>
                    <id>first-execution</id>
                    <goals>
                        <goal>java</goal>
                    </goals>
                    <configuration>
                        <mainClass>com.mycompany.FooServer</mainClass>
                    </configuration>
                </execution>
                <execution>
                    <id>second-execution</id>
                    <goals>
                        <goal>java</goal>
                    </goals>
                    <configuration>
                        <mainClass>com.mycompany.BarServer</mainClass>
                    </configuration>
                </execution>
            </executions>
        </plugin>
     </plugins>
 </build>

我可以运行 mvn exec:java@first-execution exec:java@second-excution 来运行两者,但是是否还有一个 maven 命令来简单地告诉 maven 运行任何&lt;execution&gt; 是在定义中找到的吗?

或者至少,所有匹配 &lt;goal&gt; 的执行?

【问题讨论】:

  • 我的意思是不必限定执行 ID。喜欢mvn exec:java,然后选择任何&lt;execution&gt;

标签: java maven


【解决方案1】:

Not possible and not planned as a feature。根据 Maven 项目负责人 Robert Scholte 的说法:

Maven 是生命周期驱动的。能够执行一个目标 命令行是一个特性,但是我不认为需要执行所有 可用的 executionIds。

【讨论】:

    【解决方案2】:

    不要尝试将 maven 用作通用脚本工具——它的座右铭是“约定优于配置”。

    如果您的构建需要执行外部可执行文件或 Java 代码,您可以将执行绑定到 maven阶段像这样:

    <execution>
      <id>first-execution</id>
      <goals>
        <goal>java</goal>
      </goals>
      <phase>compile</phase>
      <configuration>
        <mainClass>com.mycompany.FooServer</mainClass>
      </configuration>
    </execution>
    

    如果你用 mvn compile 调用它,那么绑定到这个阶段的所有执行(以及到这个阶段的所有其他阶段)都将被执行。通常按照 ID 的顺序排列,因此您可能希望将 ID 设置为类似 01-first02-second03-aaaa-third 的内容。

    有关配置 Maven 插件的更多信息,请参阅 official documentation

    对于哪些阶段存在以及它们执行的顺序(以及在哪个生命周期中)的参考,还有一个很好的官方文档:Lifecycle Reference

    请注意,一些插件是默认配置的,并且默认将多个执行绑定到阶段(这就是为什么 mvn compile 编译 Java 代码而无需编译器插件的任何配置)。

    另一种选择是切换到另一个具有不同理念的构建工具,比如Apache Ant——它没有很好地包含依赖管理,但甚至可以从 maven 调用。或者 Gradle Build Tool 使用基于 Groovy 或 Kotlin 构建的 DSL 作为配置,因此您可以拥有非常灵活的配置(但不要在那里这样做,否则您将在编写后几个月不理解您自己的构建配置;)

    【讨论】:

    • 谢谢指出这一点,@Michael - 我稍微更新了答案。 (答案还包括指向生命周期参考的链接,因此可以轻松查找阶段的顺序。)
    • 不是反对者,但虽然它现在更准确了,但它仍然没有回答问题。问题是运行整个生命周期阶段执行的任务比 OP 想要调用的要多。原因是 OP 想要的是哲学上的“反 Maven”。他们要求的内容不符合 Maven 使用的生命周期模型。
    • OP 的最后一句话“或者至少,所有与 <goal> 匹配的处决?”我认为匹配阶段是一个相当不错的选择(执行插件的所有执行或命令似乎毫无用处,这个问题表明) - 但只有 OP 可以决定这一点。在某些情况下,如果你想将包含非 Java 东西(例如前端)的构建与插件结合起来,你需要这样做 - 从这个角度来看,exec-maven-plugin 本身就是“反 Maven”。
    • 执行插件的所有执行或命令似乎毫无用处,这个问题表明“我倾向于或同意(或者至少,我还不确定有充分的理由允许它),这也是 Maven 项目负责人的想法(见我的回答),但这就是他们所要求的。
    猜你喜欢
    • 2011-04-16
    • 1970-01-01
    • 2012-02-29
    • 2017-04-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-02-27
    相关资源
    最近更新 更多