【问题标题】:How to handle space in argument in MAVEN_OPTS from the command line?如何从命令行处理 MAVEN_OPTS 中的参数空间?
【发布时间】:2019-09-06 08:11:33
【问题描述】:

当有空格,特别是 javaagent 参数时,我通过MAVEN_OPTS 将参数传递给我的mvn 命令时遇到一些问题。我也跟着this recommendation在分号后面加了双引号,但没有运气。

我使用的命令是这样的:

$ export MAVEN_OPTS='-javaagent:"/Users/teras/Library/Application Support/CrossMobile/Plugins/cmxray.jar"'
$ echo $MAVEN_OPTS
-javaagent:"/Users/teras/Library/Application Support/CrossMobile/Plugins/cmxray.jar"
$ mvn -P desktop,run install -B -e
Error opening zip file or JAR manifest missing : "/Users/teras/Library/Application
Error occurred during initialization of VM
agent library failed to init: instrument

不幸的是,这似乎不起作用。我在 OSX 上,使用 bash,如果这有帮助的话。

知道我错过了什么吗?

【问题讨论】:

  • 你试过这样:-javaagent:"/Users/teras/Library/Application\ Support/CrossMobile/... ?
  • @leopal 不幸的是,同样的问题:`打开 zip 文件时出错或缺少 JAR 清单:"/Users/teras/Library/Application`
  • 我只能通过编辑 mvn 命令脚本并在脚本末尾的 exec "$JAVACMD" 命令中引用 $MAVEN_OPTS 来解决此问题。不知道它可能会导致什么副作用。 exec "$JAVACMD" \ "$MAVEN_OPTS "

标签: maven maven-3


【解决方案1】:

恐怕,你不能轻易做到这一点。如果你 look at the mvn script 你可以看到它没有把 $MAVEN_OPTS 放在引号中。

所以除非有我不知道的技巧,否则没有办法逃离这个空间。

您可以通过编辑 mvn 脚本在本地解决该问题。如果你使用homebrew 安装Maven,你可以在/usr/local/Cellar/maven/<VERSION>/libexec/bin/mvn 找到它。制作脚本的副本(以便在出现问题时可以恢复它),然后在文件末尾找到这些行(可能会因版本而有所不同):

exec "$JAVACMD" \
  $MAVEN_OPTS \
  $MAVEN_DEBUG_OPTS \
  -classpath "${CLASSWORLDS_JAR}" \
  "-Dclassworlds.conf=${MAVEN_HOME}/bin/m2.conf" \
  "-Dmaven.home=${MAVEN_HOME}" "-Dmaven.multiModuleProjectDirectory=${MAVEN_PROJECTBASEDIR}" \
  ${CLASSWORLDS_LAUNCHER} "$@"

并在变量周围添加引号,使其看起来像这样:

exec "$JAVACMD" \
  "$MAVEN_OPTS" \
  "$MAVEN_DEBUG_OPTS" \
  -classpath "${CLASSWORLDS_JAR}" \
  "-Dclassworlds.conf=${MAVEN_HOME}/bin/m2.conf" \
  "-Dmaven.home=${MAVEN_HOME}" "-Dmaven.multiModuleProjectDirectory=${MAVEN_PROJECTBASEDIR}" \
  ${CLASSWORLDS_LAUNCHER} "$@"

我不确定这是 Maven 错误还是故意的。它看起来像 the issue was reported already,但似乎有来自 maven 团队的一些阻力。

更新

在阅读了上述问题的 cmets 后,我发现 this one 这解释了为什么这可能不是一个好的解决方案:

如果在这里使用时引用$MAVEN_OPTS,java 可执行文件会将其视为1 个参数,而不是多个参数,因此如果您有MAVEN_OPTS="-Xmx256m -Dparam=\"with space\"",那么java 将理解Xmx 的值256m -Dparam="with space".. .

如果你不引用它,那么每个空格分隔的标记(即使它在声明 MAVEN_OPTS 时被转义)都将被视为一个单独的参数,因此 -Dparam="with space" 将被理解为试图启动 space"带有-Dparam="with system property的主类...

【讨论】:

  • 显然不在 borune shell 中。请参阅问题中的 cmets。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-05-01
  • 1970-01-01
  • 2012-11-25
  • 2010-10-08
  • 2011-01-10
  • 1970-01-01
相关资源
最近更新 更多