【问题标题】:Test whether a -XX option is supported by Java测试 Java 是否支持 -XX 选项
【发布时间】:2014-09-12 12:54:23
【问题描述】:

我们在工作中使用了各种旧版本的 Java 1.6,由于我无法控制的各种原因,这些版本无法更新。

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

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

我尝试过/考虑过的事情

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

目前为止最好的方法,使用 -version 调用时对 Unrecognized VM 选项的输出进行 grepping,注意 -version 必须在参数之后,否则它不会对其进行测试。

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

有什么干净的方法吗?

【问题讨论】:

    标签: java shell


    【解决方案1】:

    在我的机器上,正在执行

    java -XX:+ReduceInitialCardMarks -version
    

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

    java -XX:+NoSuchOption -version
    

    返回 1 并在 stderr 上显示一些错误消息。如果这适用于您的 Java 版本,那么您可以简单地做

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

    【讨论】:

    • 我喜欢它,到目前为止最好,比我的 grep 方法更干净。我会暂缓接受,以防其他人有什么想法。
    【解决方案2】:

    你可以试试这样的:

    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
    

    见:Correct way to check Java version from BASH script

    【讨论】:

    • 谢谢,版本控制并不简单,1.6.0_18 支持此参数,但 1.6.0_15 不支持...
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-07-10
    • 1970-01-01
    • 1970-01-01
    • 2018-04-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多