You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Windows上配置exec-maven-plugin分阶段运行两个Shell脚本?

解决Windows WSL环境下Maven绑定Shell脚本到测试阶段的问题

针对你在Windows(带WSL/bash集成)环境下,Maven执行Shell脚本失败的问题,这里给出可行的POM配置方案,以及之前尝试失败的原因分析:

正确的POM配置

使用exec-maven-plugin的单个实例,配置两个execution分别绑定到pre-integration-test和post-integration-test阶段,明确调用bash执行脚本:

<build>
    <plugins>
        <plugin>
            <groupId>org.codehaus.mojo</groupId>
            <artifactId>exec-maven-plugin</artifactId>
            <version>3.1.0</version> <!-- 建议使用最新稳定版 -->
            <executions>
                <!-- 启动Docker容器 -->
                <execution>
                    <id>start-docker-containers</id>
                    <phase>pre-integration-test</phase>
                    <goals>
                        <goal>exec</goal>
                    </goals>
                    <configuration>
                        <executable>bash</executable>
                        <arguments>
                            <argument>-c</argument>
                            <!-- 使用Maven内置变量获取项目根路径,避免硬编码 -->
                            <argument>${project.basedir}/src/main/scripts/startDockerContainers.sh</argument>
                        </arguments>
                        <!-- 可选:如果脚本无执行权限,先添加权限再执行 -->
                        <!-- <arguments>
                            <argument>-c</argument>
                            <argument>chmod +x ${project.basedir}/src/main/scripts/startDockerContainers.sh && ${project.basedir}/src/main/scripts/startDockerContainers.sh</argument>
                        </arguments> -->
                    </configuration>
                </execution>
                <!-- 停止Docker容器 -->
                <execution>
                    <id>stop-docker-containers</id>
                    <phase>post-integration-test</phase>
                    <goals>
                        <goal>exec</goal>
                    </goals>
                    <configuration>
                        <executable>bash</executable>
                        <arguments>
                            <argument>-c</argument>
                            <argument>${project.basedir}/src/main/scripts/stopDockerContainers.sh</argument>
                        </arguments>
                    </configuration>
                </execution>
            </executions>
        </plugin>
    </plugins>
</build>

之前尝试失败的可能原因

  1. 方案1(两个独立插件实例):大概率是第二个插件的脚本路径配置错误,或者未指定bash执行——Windows默认会用cmd解析sh脚本,自然找不到对应文件。
  2. 方案2(同一插件多execution):可能是工作目录配置错误,或者直接执行sh脚本而未通过bash调用,Windows环境无法识别sh文件的执行器。
  3. 方案3(调用bash但退出码2):退出码2是bash的"找不到指定文件"错误,可能是路径用了Windows反斜杠,或者脚本没有执行权限,也有可能是Maven解析的路径在WSL中需要转换(不过用${project.basedir}一般能避免这个问题)。

额外排查步骤

  • 给脚本添加执行权限:在WSL终端进入src/main/scripts目录,执行chmod +x startDockerContainers.sh stopDockerContainers.sh。
  • 验证项目路径:执行mvn help:evaluate -Dexpression=project.basedir,确认输出的根路径和脚本拼接后是正确的。
  • 查看执行详情:在插件的configuration里添加<verbose>true</verbose>,执行mvn clean verify时会输出完整的执行命令,方便定位问题。

内容的提问来源于stack exchange,提问作者shaidyn

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.21 02:02:21