Java JVM选项中的通配符

Java JVM选项中的通配符,java,bash,jvm,jvm-arguments,Java,Bash,Jvm,Jvm Arguments,我有一个jar,它通过Maven拉入到构建中,因此版本包含在jar的名称中,例如: newrelic-agent-5.0.0.jar 当导出JVM选项时,为了运行jar,需要包含这个文件,但是如果我们希望JVM选项不知道版本号,并且接受构建中的任何版本,那么这就产生了一个问题 如果JVM选项如下所示: export JVM_OPTS=“…-javaagent:/path/to/lib/newrelic agent.?.jar” 可以用什么替换?,以便JVM选项在不指定依赖项版本的情况下找到有问题

我有一个jar,它通过Maven拉入到构建中,因此版本包含在jar的名称中,例如:

newrelic-agent-5.0.0.jar

当导出JVM选项时,为了运行jar,需要包含这个文件,但是如果我们希望JVM选项不知道版本号,并且接受构建中的任何版本,那么这就产生了一个问题

如果JVM选项如下所示:

export JVM_OPTS=“…-javaagent:/path/to/lib/newrelic agent.?.jar”

可以用什么替换
,以便JVM选项在不指定依赖项版本的情况下找到有问题的jar?假设只有一个jar与此文件名模式匹配。

没有glob(
*
,或类似的东西)在引号内工作(
“…”
)。您必须用glob取消引用零件。但是,
..-javaagent:/path/to/lib/newrelic agent-“*”.jar“
将无法工作,因为glob将尝试查找以
..-javaagent:
开头的文件

因此,将
jar
放在一个单独的变量中,并使用该变量。由于库可能没有或有多个版本,因此您可能希望使用检查并警告用户

#! /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"

newrelic agent-*.jar
@khachik
*
在这种情况下不起作用,
*
%