【问题标题】:How do you include a classpath wildcard as an argument to a java bash call?如何包含一个类路径通配符作为 java bash 调用的参数?
【发布时间】:2018-12-11 00:14:37
【问题描述】:

我正在尝试创建一个 bash 脚本,该脚本将在调用 java 之前构建一个参数列表,但是我无法让带有通配符的类路径参数起作用。到目前为止的脚本:

#!/bin/bash
PROP_FILES=./props/default.properties
#EXTRA_PROP_FILES_HERE

ARGS="-cp \"lib/*\""
ARGS="$ARGS -Xmx10G"
ARGS="$ARGS -Duser.timezone=GMT"
ARGS="$ARGS -Danl.property.files=$PROP_FILES"

java $ARGS main.class.path.Main

问题在于ARGS="-cp \"lib/*\""。我正在使用命令bash -x runscript.sh 调试文件。

如果我转义通配符 cp(如上面的脚本),脚本将失败并输出(注意额外的单引号):

java -cp <b>'</b>"lib/*"<b>'</b> ...

如果我不转义它,* 会扩展到 lib 目录中的所有 jar 并且也会失败

如何修改脚本以便调用它?

java -cp "lib/*" ...

注意:我知道我可以做java -cp "lib/*" $ARGS ..,,但我真的很想让它工作。

【问题讨论】:

  • is 有一个 shell 选项可以完全关闭 glob 扩展(有关列表,请参阅 help set -- 相关选项是 set -f),但这并没有修复 BashFAQ #50 中讨论的其他问题。 “使用适当的数组”是非常正确的事情。

标签: java bash


【解决方案1】:

您应该使用正确引用的数组:

propfiles='./props/default.properties'

args=(-cp 'lib/*')
args+=(-Xmx10G -Duser.timezone=GMT)
args+=("-Danl.property.files=$propfiles")

java "${args[@]}" main.class.path.Main

另外,使用大写的变量名更容易与环境变量发生冲突,所以最好避免。

【讨论】:

  • 谢谢,我试试看!有没有办法用基本字符串做到这一点?
  • 没有。我最近写了一个very detailed answer,解释了为什么不这样做。
  • ...很多非常著名的 Java 项目(ahem Tomcat ahem)都以错误的方式做这件事并没有帮助,但是......好吧,这些项目是错误的,并且他们遵循的方法(在他们的包装外壳脚本中)是错误的。 (我责怪货物崇拜——第一个 Java 项目以这种方式编写了他们的包装器,然后下一个项目在没有真正理解代码的情况下复制了它,无限重复)。
  • @lucasvw 另见BashFAQ/050
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-05-18
  • 2013-03-07
  • 2021-04-24
  • 1970-01-01
  • 1970-01-01
  • 2012-07-20
  • 1970-01-01
相关资源
最近更新 更多