从BASH脚本检查Java版本的正确方法

时间:2011-09-07 13:34:55

标签: java bash version dependency-management

如何从bash脚本检查Java是否可用(在PATH中或通过JAVA_HOME)并确保版本至少为1.5?

16 个答案:

答案 0 :(得分:71)

也许是这样的:

if type -p java; then
    echo found java executable in PATH
    _java=java
elif [[ -n "$JAVA_HOME" ]] && [[ -x "$JAVA_HOME/bin/java" ]];  then
    echo found java executable in JAVA_HOME     
    _java="$JAVA_HOME/bin/java"
else
    echo "no java"
fi

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

答案 1 :(得分:45)

您可以通过以下方式获取java版本:

JAVA_VER=$(java -version 2>&1 | sed -n ';s/.* version "\(.*\)\.\(.*\)\..*"/\1\2/p;')

它会为161.6.0_13提供151.5.0_17等版本[ "$JAVA_VER" -ge 15 ] && echo "ok, java is 1.5 or newer" || echo "it's too old..."

所以你可以在shell中轻松比较它:

{{1}}

<强>更新 这段代码应该可以正常使用openjdk和JAVA_TOOL_OPTIONS,如评论中所述。

答案 2 :(得分:16)

您可以发出java -version并阅读&amp;解析输出

java -version 2>&1 >/dev/null | grep 'java version' | awk '{print $3}'

答案 3 :(得分:5)

不同答案的组合:

JAVA_VER=$(java -version 2>&1 | grep -i version | sed 's/.*version ".*\.\(.*\)\..*"/\1/; 1q')
  • 返回Java 7的7和Java 8的8
  • 适用于OpenJDK和Oracle JDK
  • 即使设置了JAVA_TOOL_OPTIONS
  • 也能正常工作

答案 4 :(得分:5)

我编写了一个适用于JDK 9和JDK 10的bash函数。

#!/bin/bash

# returns the JDK version.
# 8 for 1.8.0_nn, 9 for 9-ea etc, and "no_java" for undetected
jdk_version() {
  local result
  local java_cmd
  if [[ -n $(type -p java) ]]
  then
    java_cmd=java
  elif [[ (-n "$JAVA_HOME") && (-x "$JAVA_HOME/bin/java") ]]
  then
    java_cmd="$JAVA_HOME/bin/java"
  fi
  local IFS=$'\n'
  # remove \r for Cygwin
  local lines=$("$java_cmd" -Xms32M -Xmx32M -version 2>&1 | tr '\r' '\n')
  if [[ -z $java_cmd ]]
  then
    result=no_java
  else
    for line in $lines; do
      if [[ (-z $result) && ($line = *"version \""*) ]]
      then
        local ver=$(echo $line | sed -e 's/.*version "\(.*\)"\(.*\)/\1/; 1q')
        # on macOS, sed doesn't support '?'
        if [[ $ver = "1."* ]]
        then
          result=$(echo $ver | sed -e 's/1\.\([0-9]*\)\(.*\)/\1/; 1q')
        else
          result=$(echo $ver | sed -e 's/\([0-9]*\)\(.*\)/\1/; 1q')
        fi
      fi
    done
  fi
  echo "$result"
}

v="$(jdk_version)"
echo $v

这为Java 8(8等)返回"1.8.0_151",为Java 9(9等)返回"9-Debian",这样可以更容易地进行进一步的比较

答案 5 :(得分:2)

我最终使用的方法是:

# Work out the JAVA version we are working with:
JAVA_VER_MAJOR=""
JAVA_VER_MINOR=""
JAVA_VER_BUILD=""

# Based on: http://stackoverflow.com/a/32026447
for token in $(java -version 2>&1 | grep -i version)
do
    if [[ $token =~ \"([[:digit:]])\.([[:digit:]])\.(.*)\" ]]
    then
        JAVA_VER_MAJOR=${BASH_REMATCH[1]}
        JAVA_VER_MINOR=${BASH_REMATCH[2]}
        JAVA_VER_BUILD=${BASH_REMATCH[3]}
        break
    fi
done

即使JAVA_TOOL_OPTIONS由于grep过滤而设置为某种东西,它也能正常工作。

答案 6 :(得分:2)

您还可以将jdk类的版本号与javap进行比较:

javap -verbose java.lang.String | grep "major version" | cut -d " " -f5

如果它的Java 8,它将为Java 11打印52和55。这样,您可以进行简单的比较,而不必处理版本字符串解析。

答案 7 :(得分:1)

我知道这是一个非常古老的帖子,但这对其他人来说仍然有帮助。

要知道您是在运行Java 5,6还是7,首先输入java -version

输出中会有一行看起来与此类似: java版“1.7.0_55”

然后使用此表将“行话”结果转换为版本号。

1.7.0_55是Java 7
1.6.0_75是Java 6
1.5.0_65是Java 5

从Oracle网站上的页面获取的信息
http://www.oracle.com/technetwork/java/javase/7u55-relnotes-2177812.html

答案 8 :(得分:1)

我有一个类似的问题,我想检查安装了哪种版本的Java来执行两种类型的应用程序启动。 以下代码解决了我的问题

jdk_version() {
  local result
  local java_cmd
  if [[ -n $(type -p java) ]]
  then
    java_cmd=java
  elif [[ (-n "$JAVA_HOME") && (-x "$JAVA_HOME/bin/java") ]]
  then
    java_cmd="$JAVA_HOME/bin/java"
  fi
  local IFS=$'\n'
  # remove \r for Cygwin
  local lines=$("$java_cmd" -Xms32M -Xmx32M -version 2>&1 | tr '\r' '\n')
  if [[ -z $java_cmd ]]
  then
    result=no_java
  else
    for line in $lines; do
      if [[ (-z $result) && ($line = *"version \""*) ]]
      then
        local ver=$(echo $line | sed -e 's/.*version "\(.*\)"\(.*\)/\1/; 1q')
        # on macOS, sed doesn't support '?'
        if [[ $ver = "1."* ]]
        then
          result=$(echo $ver | sed -e 's/1\.\([0-9]*\)\(.*\)/\1/; 1q')
        else
          result=$(echo $ver | sed -e 's/\([0-9]*\)\(.*\)/\1/; 1q')
        fi
      fi
    done
  fi
  echo "$result"
}

_java="$(jdk_version)"
echo $_java

if [[ "$_java" > "$8" ]]; then
       echo version is more than 8

else
  echo version is less than 8

fi

source

我希望能被证明有用

答案 9 :(得分:1)

  1. 在终端
java -version |& grep 'version' |& awk -F\" '{ split($2,a,"."); print a[1]"."a[2]}'
  1. 在BASH中
#!/bin/bash


echo `java -version 2>&1 | grep 'version' 2>&1 | awk -F\" '{ split($2,a,"."); print a[1]"."a[2]}'`
jver=`java -version 2>&1 | grep 'version' 2>&1 | awk -F\" '{ split($2,a,"."); print a[1]"."a[2]}'`

if [[ $jver == "1.8" ]]; then                
     echo $jver is java 8
else
     echo $jver is java 11
fi

在SUN和Linux中工作

答案 10 :(得分:1)

这里有一个不错的可移植bash函数:http://eed3si9n.com/detecting-java-version-bash

jdk_version() {
  local result
  local java_cmd
  if [[ -n $(type -p java) ]]
  then
    java_cmd=java
  elif [[ (-n "$JAVA_HOME") && (-x "$JAVA_HOME/bin/java") ]]
  then
    java_cmd="$JAVA_HOME/bin/java"
  fi
  local IFS=$'\n'
  # remove \r for Cygwin
  local lines=$("$java_cmd" -Xms32M -Xmx32M -version 2>&1 | tr '\r' '\n')
  if [[ -z $java_cmd ]]
  then
    result=no_java
  else
    for line in $lines; do
      if [[ (-z $result) && ($line = *"version \""*) ]]
      then
        local ver=$(echo $line | sed -e 's/.*version "\(.*\)"\(.*\)/\1/; 1q')
        # on macOS, sed doesn't support '?'
        if [[ $ver = "1."* ]]
        then
          result=$(echo $ver | sed -e 's/1\.\([0-9]*\)\(.*\)/\1/; 1q')
        else
          result=$(echo $ver | sed -e 's/\([0-9]*\)\(.*\)/\1/; 1q')
        fi
      fi
    done
  fi
  echo "$result"
}

答案 11 :(得分:0)

使用bashj,一个扩展的bash版本(https://sourceforge.net/projects/bashj/),你会得到一个相当紧凑的解决方案:

#!/usr/bin/bashj
echo System.getProperty("java.runtime.version")

答案由集成的JVM提供(脚本的执行时间约为0.017,执行时间为〜{0.004&#39;&#39;用于调用本身)。

答案 12 :(得分:0)

以上答案仅适用于特定的Java版本(通常适用于Java 9之前的版本或Java 8之后的版本。

我写了一个简单的线性代码,它将为Java版本6至11返回一个整数。

基本上删除了“ 1”。在版本号的开头(如果存在),然后仅考虑下一个“。”之前的第一个数字。

java -version 2>&1 | head -1 | cut -d'"' -f2 | sed '/^1\./s///' | cut -d'.' -f1

答案 13 :(得分:0)

另一种方法是: release中有一个名为$JAVA_HOME的文件。 在Java 15(Debian)上,它具有以下内容:

IMPLEMENTOR="Debian"
JAVA_VERSION="15.0.1"
JAVA_VERSION_DATE="2020-10-20"
MODULES="java.base java.compiler java.datatransfer java.xml java.prefs java.desktop java.instrument java.logging java.management java.security.sasl java.naming java.rmi java.management.rmi java.net.http java.scripting java.security.jgss java.transaction.xa java.sql java.sql.rowset java.xml.crypto java.se java.smartcardio jdk.accessibility jdk.internal.vm.ci jdk.management jdk.unsupported jdk.internal.vm.compiler jdk.aot jdk.internal.jvmstat jdk.attach jdk.charsets jdk.compiler jdk.crypto.ec jdk.crypto.cryptoki jdk.dynalink jdk.internal.ed jdk.editpad jdk.hotspot.agent jdk.httpserver jdk.incubator.foreign jdk.internal.opt jdk.jdeps jdk.jlink jdk.incubator.jpackage jdk.internal.le jdk.internal.vm.compiler.management jdk.jartool jdk.javadoc jdk.jcmd jdk.management.agent jdk.jconsole jdk.jdwp.agent jdk.jdi jdk.jfr jdk.jshell jdk.jsobject jdk.jstatd jdk.localedata jdk.management.jfr jdk.naming.dns jdk.naming.rmi jdk.net jdk.nio.mapmode jdk.sctp jdk.security.auth jdk.security.jgss jdk.unsupported.desktop jdk.xml.dom jdk.zipfs"
OS_ARCH="x86_64"
OS_NAME="Linux"
SOURCE=""

所以您看到JAVA_VERSION,其中包含版本号。

例如,

major=$(echo $JAVA_VERSION | cut -d. -f1)

major设置为值15(=主版本号),您可以进一步使用它。

这是一个非常简单的解决方案。

答案 14 :(得分:0)

我发现以下效果很好。它是来自Michał Šrajerjmj

的答案的组合

version=$(java -version 2>&1 | sed -n ';s/.* version "\(.*\)\.\(.*\)\..*"/\1\2/p;' | awk '{ print $1 }')

我已经安装了 openJDK 13 并且没有 awk 命令打印第一个答案:130 2020-01-14。因此,添加 awk '{ print $1 }' 只为我提供了版本。

答案 15 :(得分:0)

仅使用带有 Perl 风格正则表达式的 grep 来确定 Java 版本可以这样完成:

java -version 2>&1 | grep -oP 'version "?(1\.)?\K\d+'

这将打印 Java 9 或更高版本的主要版本和版本低于 9 的次要版本,例如 8 用于 Java 1.811 用于 Java {{1} }.

可以这样使用:

11.0.4

添加了 JAVA_MAJOR_VERSION=$(java -version 2>&1 | grep -oP 'version "?(1\.)?\K\d+' || true) if [[ $JAVA_MAJOR_VERSION -lt 8 ]]; then echo "Java 8 or higher is required!" exit 1 fi 以防止脚本在未安装 Java 且启用了 Shell 选项 || true 的情况下中止。