Comment puis-je vérifier si Java est disponible (dans le PATH ou via Java_HOME) à partir d'un script bash et m'assurer que la version est au moins 1.5?
Peut-être quelque chose comme:
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
Vous pouvez obtenir la version Java via:
Java_VER=$(Java -version 2>&1 | sed -n ';s/.* version "\(.*\)\.\(.*\)\..*"/\1\2/p;')
il vous donnera 16
pour Java comme 1.6.0_13
et 15
pour la version comme 1.5.0_17
.
Vous pouvez donc facilement le comparer dans Shell:
[ "$Java_VER" -ge 15 ] && echo "ok, Java is 1.5 or newer" || echo "it's too old..."
UPDATE: Ce code devrait fonctionner correctement avec openjdk et Java_TOOL_OPTIONS comme indiqué dans les commentaires.
Vous pouvez émettre Java -version
et lire & analyser le résultat
Java -version 2>&1 >/dev/null | grep 'Java version' | awk '{print $3}'
Une combinaison de différentes réponses:
Java_VER=$(Java -version 2>&1 | grep -i version | sed 's/.*version ".*\.\(.*\)\..*"/\1/; 1q')
7
pour Java 7 et 8
pour Java 8J'ai écrit une fonction bash qui devrait fonctionner pour JDK 9 et 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
Cela renvoie 8
pour Java 8 ("1.8.0_151"
etc) et 9
pour Java 9 ("9-Debian"
etc), ce qui devrait faciliter la comparaison.
La méthode que j'ai finalement utilisée est la suivante:
# 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
Cela fonctionnera correctement même si Java_TOOL_OPTIONS est défini sur quelque chose en raison du filtrage effectué par grep.
Je sais que c'est un très vieux fil, mais cela aidera toujours les autres.
Pour savoir si vous utilisez Java 5, 6 ou 7, tapez d’abord Java -version
.
Il y aura une ligne dans votre sortie qui ressemble à ceci: Version Java "1.7.0_55"
Ensuite, vous utilisez cette table pour convertir le résultat "jargon" en numéro de version.
1.7.0_55 est Java 7
1.6.0_75 est Java 6
1.5.0_65 est Java 5
Informations extraites d'une page du site Oracle
http://www.Oracle.com/technetwork/Java/javase/7u55-relnotes-2177812.html
J'ai eu un problème similaire, je voulais vérifier quelle version de Java était installée pour effectuer deux types de lancements d'applications . Le code suivant a résolu mon problème
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
J'espère être utile
En utilisant bashj, une version étendue de bash ( https://sourceforge.net/projects/bashj/ ), vous obtenez une solution plutôt compacte:
#!/usr/bin/bashj
echo System.getProperty("Java.runtime.version")
La réponse est fournie par une machine virtuelle Java intégrée (avec un temps d'exécution de ~ 0.017 '' pour le script et de 0.004 '' pour l'appel lui-même).
Les réponses ci-dessus ne fonctionnent correctement que pour certaines versions de Java (généralement pour les versions antérieures à Java 9 ou pour les versions ultérieures de Java 8.
J'ai écrit une simple ligne qui renverra un entier pour les versions de Java 6 à 11.
Il laisse tomber essentiellement le "1" au début du numéro de version, s'il existe, et considère ensuite uniquement le premier numéro avant le prochain ".".
Java -version 2>&1 | head -1 | cut -d'"' -f2 | sed '/^1\./s///' | cut -d'.' -f1