如何将 $@ 传递给 Maven 的 exec.args ?

如何将 $@ 传递给 Maven 的 exec.args ?

我在脚本中尝试过的事情run.sh

mvn exec:java -Dexec.mainClass=my.App -Dexec.args="$@"
mvn exec:java -Dexec.mainClass=my.App -Dexec.args=$@

当我这样调用脚本时:

./run.sh arg1 arg2 arg3

参数不会传递给 Java 应用程序。相反,Maven 尝试将它们解释为 Maven 选项。

编辑:我使用了-x选项。我看到这个:

mvn exec:java -Dexec.mainClass=my.App -Dexec.args=arg1 arg2 arg3

我怎样才能让它评估为:

mvn exec:java -Dexec.mainClass=my.App -Dexec.args="arg1 arg2 arg3"

这将解决我的问题。我尝试了很多变体,但无法使其工作。

答案1

当 shell 展开-Dexec.args="$@"并且位置参数列表为arg1, arg2,arg3时,您将得到列表-Dexec.args=arg1, arg2, arg3( 的三个单独的参数mvn)。扩展"$@"始终是一个列表,并且将其与字符串连接的结果(如您在代码中所做的那样)实际上并未明确定义(大多数 shell 的行为如我在此处所描述的那样)。

你什么可能想要"$*"代替"$@".的扩展"$*"始终是由位置参数列表的元素组成的单个字符串,并与$IFS作为分隔符的第一个字符(通常是空格)连接起来。这样-Dexec.args="$*"你就得到了字符串-Dexec.args=arg1 arg2 arg3( 的一个参数mvn)。

所以:

mvn exec:java -Dexec.mainClass=my.App -Dexec.args="$*"

请注意,如果任何参数包含空格,则很难正确mvn解析它,除非该工具支持一些特殊的转义、引用或其他编码来处理它(并且您在参数列表中使用它)。我不是 Maven 用户,所以我不知道它如何解析该exec.args值。

也可以看看$* 和 $@ 有什么区别?

相关内容