测试一个 -XX 选项是否被 Java 支持

3

在工作中,我们使用各种旧版本的Java 1.6,由于各种原因无法进行更新,超出了我的控制范围。

有些支持-XX:ReduceInitialCardMarks,有些不支持,并且如果您尝试使用不受支持的选项,则会退出。

我想要一个shell脚本,如果可用,就使用-XX:ReduceInitialCardMarks选项调用java,否则不使用该选项。

我尝试/正在考虑的事情:

  • -X,这只会打印出-X参数而不是-XX
  • 测试版本?如何测试?需要预先知道哪个版本支持什么
  • 使用虚拟应用程序调用并测试返回值,例如java -XX:ReduceInitialCardMarks -jar dummy.jar。 rt.jar中没有适合使用的具有static void main()的静态类,因此必须自己制作。

迄今为止最好的方法是,在使用-version调用时从输出中搜索Unrecognized VM option,注意-version必须在参数之后,否则它不会对其进行测试。

if java -XX:-ReduceInitialCardMarks -version 2>&1 | grep -q 'Unrecognized VM option'; then echo "Not supported"; else echo "Supported"; fi

有没有一种干净的方法来做到这一点?

2个回答

3

在我的电脑上执行

java -XX:+ReduceInitialCardMarks -version

返回0和版本信息(因为该选项受支持),然后执行。

java -XX:+NoSuchOption -version

如果您的Java版本符合要求,它会在stderr上返回一些错误消息并返回1。那么您可以简单地执行以下操作:

if java -XX:+ReduceInitialCardMarks -version; then
    echo "Supported"
else
    echo "Unsupported"
fi

我喜欢它,到目前为止是最好的,比我的grep方法更干净。我会暂时不接受,以防其他人有更好的想法。 - Adam

0
你可以尝试这样做:
if [[ -n "$JAVA_HOME" ]] && [[ -x "$JAVA_HOME/bin/java" ]];  then   
    _java="$JAVA_HOME/bin/java"

if [[ "$_java" ]]; then
    version=$("$_java" -version 2>&1 | awk -F '"' '/version/ {print $2}')
    echo version "$version"
    if [[ "$version" > "1.6" ]]; then
        # do work
    else         
        echo version is less than 1.6
        exit
    fi
fi

请参见:从BASH脚本中正确检查Java版本的方法


谢谢,版本控制并不是那么直接,1.6.0_18支持这个参数,但1.6.0_15则不支持等等… - Adam

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接