如何将环境变量参数从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
相关产品推荐
相关产品推荐

