Правильный способ проверить версию Java из BASH-скрипта - PullRequest
52 голосов
/ 07 сентября 2011

Как я могу проверить, доступна ли Java (в PATH или через JAVA_HOME) из скрипта bash, и убедиться, что версия не ниже 1.5?

Ответы [ 10 ]

73 голосов
/ 07 сентября 2011

Возможно что-то вроде:

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
45 голосов
/ 07 сентября 2011

Вы можете получить версию Java через:

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

это даст вам 16 для Java, как 1.6.0_13 и 15 для версии, как 1.5.0_17.

Так что вы можете легко сравнить его в оболочке:

[ "$JAVA_VER" -ge 15 ] && echo "ok, java is 1.5 or newer" || echo "it's too old..."

UPDATE: Этот код должен хорошо работать с openjdk и JAVA_TOOL_OPTIONS, как упомянуто в комментариях.

16 голосов
/ 07 сентября 2011

Вы можете выдать java -version и прочитать и проанализировать вывод

java -version 2>&1 >/dev/null | grep 'java version' | awk '{print $3}'
5 голосов
/ 16 февраля 2018

Я написал функцию bash, которая должна работать для JDK 9 и JDK 10.

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

Это возвращает 8 для Java 8 ("1.8.0_151" и т. Д.) И 9 для Java 9 ("9-Debian" и т. Д.), Что облегчит дальнейшее сравнение.

5 голосов
/ 03 ноября 2016

Сочетание разных ответов:

JAVA_VER=$(java -version 2>&1 | grep -i version | sed 's/.*version ".*\.\(.*\)\..*"/\1/; 1q')
  • Возвращает 7 для Java 7 и 8 для Java 8
  • Работает с OpenJDK и с Oracle JDK
  • Работает, даже если JAVA_TOOL_OPTIONS установлен
2 голосов
/ 02 июня 2016

В итоге я использовал метод:

# 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.

1 голос
/ 21 мая 2019

Ответы выше работают корректно только для определенных версий Java (обычно для версий до Java 9 или для версий после Java 8.

Я написал простую строку, которая будет возвращать целое число для версий Java 6до 11.

Он в основном сбрасывает «1.» в начале номера версии, если он существует, и затем рассматривает только первое число перед следующим «.».

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

1 голос
/ 01 января 2019

У меня была похожая проблема, я хотел проверить, какая версия 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

источник

Я надеюсь, что окажусь полезным

1 голос
/ 26 ноября 2014

Я знаю, что это очень старая тема, но она все равно будет полезна другим.

Чтобы узнать, используете ли вы 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

0 голосов
/ 18 июня 2018

Используя bashj, расширенную версию bash (https://sourceforge.net/projects/bashj/),, вы получаете довольно компактное решение:

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

Ответ обеспечивается встроенной JVM (за ~ 0,017 '' времени выполнения длясценарий и ~ 0,004 '' для самого вызова).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...