Подтвердить что ты не робот

Правильный способ проверки версии Java из BASH script

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

4b9b3361

Ответ 1

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

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

Ответ 2

Вы можете получить версию 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 too old..."

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

Ответ 3

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

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

Ответ 4

Комбинация разных ответов:

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

Ответ 5

Я написал функцию 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" т.д.), Что должно облегчить дальнейшее сравнение.

Ответ 6

Метод, который я использовал, - это:

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

Ответ 7

Я знаю, что это очень старый поток, но это все равно поможет другим.

Чтобы узнать, используете ли вы Java 5, 6 или 7, сначала введите java -version.

На вашем выходе будет строка, которая выглядит примерно так: java version "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

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

источник

Я надеюсь быть полезным

Ответ 9

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

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

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

Ответ 10

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

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

Это в основном опускает "1". в начале номера версии, если он существует, а затем рассматривает только первое число перед следующим ".".

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