我在脚本中尝试过的事情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
值。
也可以看看$* 和 $@ 有什么区别?