web-dev-qa-db-fra.com

Méthode correcte pour vérifier la version Java à partir d'un script BASH

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?

48
Aaron Digulla

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
67
glenn jackman

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.

43
Michał Šrajer

Vous pouvez émettre Java -version et lire & analyser le résultat

Java -version 2>&1 >/dev/null | grep 'Java version' | awk '{print $3}'
16
Jigar Joshi

Une combinaison de différentes réponses:

Java_VER=$(Java -version 2>&1 | grep -i version | sed 's/.*version ".*\.\(.*\)\..*"/\1/; 1q')
  • Renvoie 7 pour Java 7 et 8 pour Java 8
  • Fonctionne avec OpenJDK et avec Oracle JDK
  • Fonctionne même si Java_TOOL_OPTIONS est défini
5
user3193604

J'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.

4
Eugene Yokota

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.

2
Jinesh Choksi

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

1
Richard

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

la source

J'espère être utile

1
vincenzopalazzo

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

0
Fil

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

0
dvlcube