java - JVM 选项中的通配符
问题描述
我有一个通过 Maven 拉入构建的 jar,因此版本包含在 jar 的名称中,例如:
newrelic-agent-5.0.0.jar
导出 JVM 选项时,为了运行 jar,需要包含此文件,但是如果我们希望 JVM 选项与版本号无关,并接受构建中的任何版本,这会导致问题。
如果JVM选项如下:
导出 JVM_OPTS="...-javaagent:/path/to/lib/newrelic-agent.?.jar"
可以用什么?
替换,以便 JVM 选项在不指定依赖版本的情况下找到有问题的 jar?假设只有一个 jar 与此文件名模式匹配。
解决方案
没有 glob ( *
,?
或类似的东西) 在引号 ( "…"
) 内起作用。您必须使用 glob 取消引用该部分。但是,"… -javaagent:/path/to/lib/newrelic-agent-"*".jar"
由于 glob 会尝试查找以… -javaagent:
.
因此,在一个单独的变量中使用 globjar
并使用该变量。由于可能没有或有多个版本的库,您可能希望使用检查并警告用户
#! /bin/bash
lib=("/path/to/lib/newrelic-agent-"*.jar)
if [ "${#lib[@]}" != 1 ]; then
echo "Found no or multiple versions of lib newrelic agent"
exit 1
fi
export JVM_OPTS="... -javaagent:$lib"
这仅适用于bash
支持数组的类似 shell array=(…)
。如果您需要 posix 版本,请使用
#! /bin/sh
exactlyOne() {
if [ "$#" != 1 ]; then
echo "Found no or multiple matches"
exit 1
fi
echo "$1"
}
lib=$(exactlyOne "/path/to/lib/newrelic-agent-"*.jar)
export JVM_OPTS="... -javaagent:$lib"
推荐阅读
- c# - 使用 C# 我想创建一个条形图,显示 excel 列中每个值的计数
- oauth-2.0 - 存储在数据库中的 Json Web 令牌和验证
- angular - 使用 Msal 对 Angular 中的 Azure 广告进行身份验证
- python - 无缓冲的python覆盖率
- javascript - 如何在javascript中更改音频文件编解码器
- c - 一个动画处理图标,纯C
- python - 使用 Kmeans 聚类压缩多个图像
- django - 我使用 distinct() 对吗?
- object - Python vs VBS COM 对象处理
- python - 在不同的数据框中搜索匹配,然后将列重命名为匹配