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

如何将环境变量参数从Maven传递给Shell脚本?

解决Maven Exec插件传递-D参数给Shell脚本的问题

我来帮你搞定这个问题——之前用Maven exec插件调用Shell脚本时,也踩过类似的参数传递坑。你遇到的核心问题是Maven属性和Shell变量的上下文不匹配,直接用${env.foo}或${foo}的方式没找对正确的传递路径,导致脚本拿到的是字面量而非实际值。

为什么之前的方法行不通?

  • ${env.foo}是读取Shell的环境变量,但你通过-Dfoo=bar传入的是Maven系统属性,不是Shell环境变量,自然拿不到值。
  • 直接写${foo}如果配置不当(比如在command字段里直接拼接而没用arguments),Maven可能无法正确解析替换,或者被Shell转义成了字面量。

两种可靠的解决方案

方案1:通过位置参数传递(简单直接)

在pom.xml的exec插件配置里,用<arguments>节点把Maven参数作为位置参数传给脚本,这样脚本可以通过$1、$2等位置变量获取值。

示例pom.xml配置:

<build>
    <plugins>
        <plugin>
            <groupId>org.codehaus.mojo</groupId>
            <artifactId>exec-maven-plugin</artifactId>
            <version>3.1.0</version>
            <executions>
                <execution>
                    <id>run-custom-script</id>
                    <phase>compile</phase>
                    <goals>
                        <goal>exec</goal>
                    </goals>
                    <configuration>
                        <!-- 指定你的Shell解释器 -->
                        <executable>bash</executable>
                        <arguments>
                            <!-- 你的Shell脚本路径 -->
                            <argument>${project.basedir}/your-script.sh</argument>
                            <!-- 传递Maven系统属性foo的值作为脚本的第一个参数 -->
                            <argument>${foo}</argument>
                            <!-- 如果有多个参数,继续添加<argument> -->
                            <!-- <argument>${bar}</argument> -->
                        </arguments>
                    </configuration>
                </execution>
            </executions>
        </plugin>
    </plugins>
</build>

对应的Shell脚本your-script.sh里,直接用位置变量获取:

#!/bin/bash
echo "拿到的foo值是:$1"
# 如果有多个参数,用$2、$3以此类推

执行命令mvn exec:exec compile -Dfoo=bar,脚本就能输出拿到的foo值是:bar了。

方案2:导出为Shell环境变量(适合需要多个环境变量的场景)

如果你的脚本依赖多个环境变量,或者习惯用环境变量而非位置参数,可以在exec命令里先导出Maven属性为Shell环境变量,再执行脚本。

示例pom.xml配置:

<configuration>
    <executable>bash</executable>
    <arguments>
        <argument>-c</argument>
        <!-- 先导出环境变量,再执行脚本 -->
        <argument>export FOO=${foo}; export BAR=${bar}; ${project.basedir}/your-script.sh</argument>
    </arguments>
</configuration>

对应的Shell脚本里,直接用环境变量获取:

#!/bin/bash
echo "通过环境变量拿到的foo值是:$FOO"
echo "通过环境变量拿到的bar值是:$BAR"

注意事项

  • 如果参数包含空格或特殊字符,在<argument>里要加上引号,比如<argument>"${foo}"</argument>,避免Shell解析出错。
  • 确保exec-maven-plugin的版本是较新的(比如3.1.0及以上),旧版本可能存在参数解析的bug。
  • 如果Maven属性是可选的,可以给属性设置默认值,比如在pom.xml里添加:
    <properties>
        <foo>default-value</foo>
    </properties>
    
    这样如果没传-Dfoo,脚本会拿到默认值。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 09:51:20