Domanda Modo corretto per verificare la versione di Java dallo script BASH


Come posso verificare se Java è disponibile (nel PATH o tramite JAVA_HOME) da uno script bash e verificare che la versione sia almeno 1.5?


46
2017-09-07 13:34


origine


risposte:


Forse qualcosa come:

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

61
2017-09-07 14:24



Puoi ottenere la versione java tramite:

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

ti darà 16 per java come 1.6.0_13 e 15 per versione come 1.5.0_17.

Quindi puoi facilmente confrontarlo in shell:

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

AGGIORNARE: Questo codice dovrebbe funzionare bene con openjdk e JAVA_TOOL_OPTIONS come menzionato nei commenti.


43
2017-09-07 13:58



Puoi emettere java -version e leggi e analizza l'output

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

15
2017-09-07 13:36



Una combinazione di diverse risposte:

JAVA_VER=$(java -version 2>&1 | grep -i version | sed 's/.*version ".*\.\(.*\)\..*"/\1/; 1q')
  • ritorna 7 per Java 7 e 8 per Java 8
  • Funziona con OpenJDK e con Oracle JDK
  • Funziona anche se è impostato JAVA_TOOL_OPTIONS

5
2017-11-03 17:17



Ho scritto una funzione bash che dovrebbe funzionare per JDK 9 e 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

Questo ritorna 8 per Java 8 ("1.8.0_151" ecc), e 9 per Java 9 ("9-Debian" ecc.), che dovrebbe facilitare l'ulteriore confronto.


3
2018-02-15 23:33



Il metodo che ho usato è:

# 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

Funzionerà correttamente anche se JAVA_TOOL_OPTIONS è impostato su qualcosa a causa del filtraggio fatto da grep.


2
2018-06-02 13:56



So che questo è un thread molto vecchio, ma sarà comunque di aiuto agli altri.

Per sapere se stai utilizzando Java 5, 6 o 7, innanzitutto scrivi java -version.

Ci sarà una riga nel tuo output che sembra simile a questo: versione java "1.7.0_55"

Quindi si utilizza questa tabella per convertire il risultato 'jargon' nel numero di versione.

1.7.0_55 è Java 7
1.6.0_75 è Java 6
1.5.0_65 è Java 5

Informazioni tratte da una pagina sul sito Oracle
http://www.oracle.com/technetwork/java/javase/7u55-relnotes-2177812.html


0
2017-11-26 08:01