JVM选项中的通配符

时间:2019-05-28 15:08:48

标签: 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?假设只有一个jar与此文件名模式匹配。

1 个答案:

答案 0 :(得分:1)

引号(*)内没有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的类似array=(…)的shell中起作用。如果您需要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"