Как я могу проверить, доступна ли Java (в PATH или через JAVA_HOME) из bash script и убедитесь, что версия не менее 1,5?
Правильный способ проверки версии Java из BASH script
Ответ 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