使用bash通配符设置Java命令行属性是否可行?
直接用通配符作为Java命令行属性参数不可行,这里是解决方案
直接把带通配符的路径写在-Djava.library.path=后面是不行的,原因很简单:bash的通配符展开规则不会作用于这种连在一起的参数字符串里。
让我给你掰扯清楚:bash只会对那些作为独立单词、且没有被引号包裹的通配符进行展开。但你写的-Djava.library.path=/usr/lib/jvm/java-awsome-*/jre/lib/amd64是一个完整的命令行参数,bash会把整个字符串原封不动传给Java,Java拿到的路径里就带着个*,自然找不到对应的目录——它可不懂bash的通配符规则。
那该怎么解决?这里有几个靠谱的办法:
方法1:提前用bash展开路径再传入
先通过bash找到匹配的目录,存到变量里,再传给Java:
# 用ls -d列出所有匹配的目录,head -n1取第一个(如果多个版本存在) LIB_PATH=$(ls -d /usr/lib/jvm/java-awsome-*/jre/lib/amd64 | head -n 1) # 检查是否找到路径,避免空值 if [ -z "$LIB_PATH" ]; then echo "Error: No matching java-awesome library path found!" exit 1 fi # 启动Java程序 java -Djava.library.path="$LIB_PATH" YourMainClass
方法2:用bash数组更安全地处理
如果担心目录名有特殊字符(比如空格,虽然这里不太可能),用数组来存储匹配结果更稳妥:
# 把所有匹配的目录存入数组 lib_paths=(/usr/lib/jvm/java-awsome-*/jre/lib/amd64) # 检查数组是否为空 if [[ ${#lib_paths[@]} -eq 0 ]]; then echo "Error: No matching java-awesome library path found!" exit 1 fi # 取第一个匹配的目录(如果有多个版本,可根据需求调整索引) java -Djava.library.path="${lib_paths[0]}" YourMainClass
额外提示
如果你的环境里可能存在多个java-awsome-*版本,最好加个检查逻辑,比如确保只有一个匹配项,或者根据版本号排序取最新的(可以用sort -V来按版本号排序):
LIB_PATH=$(ls -d /usr/lib/jvm/java-awsome-*/jre/lib/amd64 | sort -V | tail -n 1)
这样就能自动拿到最新版本的路径了。
内容的提问来源于stack exchange,提问作者user3837712
相关产品推荐
相关产品推荐

