You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Bash脚本向Maven exec传递多参数失效问题求助

Fixing Multi-Argument Passing in Your runMain Bash Script

我明白你的问题——当传递单个参数时脚本正常工作,但多个参数就失效了,这是因为参数的传递方式没有正确适配Maven exec:java 的需求。

问题根源

你的原脚本中,-Dexec.args="$@" 会把所有命令行参数打包成一个单一的字符串传递给Maven。Maven的exec插件会将这个整个字符串当作一个参数传给你的Java主类,而不是拆分出多个独立的参数。这就是多参数场景下失效的核心原因。

修复方案

我们需要让每个参数都被独立识别,最可靠的方式是用printf给每个参数添加合适的shell转义(比如给含空格的参数加引号),确保Maven能正确解析每个参数:

#!/bin/bash
mvn exec:java -Dexec.mainClass=org.fjx.main.Main -f fjxRepo/pom.xml -Dexec.args="$(printf "%q " "$@")"

为什么这能生效

printf "%q " "$@" 会遍历你传入的所有参数:

  • 对于普通参数(如hello),它会直接保留原内容
  • 对于包含空格或特殊字符的参数(如"hello world"),它会自动添加双引号进行转义
  • 最终拼接成的字符串会让Maven的exec插件正确拆分出每个独立的参数,传递给你的Main类的main方法。

另一种手动处理的方式(可选)

如果你更倾向于手动构建参数列表,也可以用循环给每个参数加引号:

#!/bin/bash
# 初始化一个空数组来存储处理后的参数
formatted_args=()
for arg in "$@"; do
    # 给每个参数包裹双引号
    formatted_args+=("\"$arg\"")
done
# 将数组元素拼接成空格分隔的字符串,传递给exec.args
mvn exec:java -Dexec.mainClass=org.fjx.main.Main -f fjxRepo/pom.xml -Dexec.args="${formatted_args[*]}"

不过第一种printf的方式更简洁,且能自动处理特殊字符(比如参数中包含引号、反斜杠等情况),推荐优先使用。

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

火山引擎 最新活动