如何在 Maven 中一次性执行插件的所有 execution 配置?

maven 不支持通过单条命令自动执行插件中定义的所有 ``,这是由其生命周期驱动的设计决定的;必须显式指定每个 execution id(如 `exec:java@first-execution`),不存在通配符或“全部执行”的语法。

在 Maven 的设计哲学中,构建过程严格围绕标准生命周期阶段(如 compile、test、package)展开,而插件的 是绑定到这些阶段上才被自动触发的。命令行调用(如 mvn exec:java@id)属于直接目标调用(direct goal invocation),它绕过生命周期,仅执行指定 ID 的配置——这本身就是一种显式、可控的机制。

因此,像 mvn exec:java@first-execution exec:java@second-execution 这样的多目标调用是合法且推荐的方式,但以下写法均无效

# ❌ 错误:不支持通配符
mvn exec:java@*

# ❌ 错误:无法按 goal 批量匹配
mvn exec:java

# ❌ 错误:不存在 "all-executions" 伪目标
mvn exec:java@all
⚠️ 注意:即使多个 绑定到同一 goal(如都使用 java),Maven 也不会自动聚合它们。每个 必须拥有唯一 id,且仅在显式引用时生效。

✅ 推荐实践方案

  1. 绑定到生命周期阶段(推荐用于常规构建)
    若希望多个执行逻辑在构建过程中自动运行,应将它们绑定到不同或相同的生命周期阶段:

    
      
        start-foo-server
        pre-integration-test
        java
        
          com.mycompany.FooServer
          true
        
      
      
        start-bar-server
        pre-integration-test
        java
        
          com.mycompany.BarServer
          true
        
      
    

    然后只需运行:

    mvn verify  # 自动触发 pre-integration-test 阶段下的全部 execution
  2. 封装为自定义 profile 或别名(提升 CLI 可用性)
    使用 shell 别名(Linux/macOS)或批处理脚本(Windows)简化重复调用:

    # ~/.bashrc 或 ~/.zshrc
    alias mvn-start-servers='mvn exec:java@first-execution exec:java@second-execution'
  3. 借助 Maven Wrapper + 外部脚本编排
    对于复杂多进程场景(如启动多个服务),建议交由 docker-compose、npm run 或专用启动脚本管理,而非强求 Maven 承担进程编排职责。

? 总结

Maven 明确拒绝引入“执行所有 execution”的功能(GitHub #357 已关闭),核心原因在于:

  • 违背“明确优于隐式”的工程原则;
  • 模糊生命周期语义,增加调试与可重现性难度;
  • 与插件设计初衷(每个 execution 应有清晰上下文与时机)相冲突。

因此,请始终以绑定生命周期显式列举 execution ID 作为标准做法,避免寻求不存在的“批量执行”捷径。