Check compatibilità Java Virtual Machine

DOMANDA:

Come posso controllare se la versione della Java Virtual Machine (JVM) installata è compatibile con il mio programma?


RISPOSTA:

Per controllare la versione della Java Virtual Machine (JVM) installata e informare l'utente dell'incompatibilità con il nostro programma, possiamo usare uno script batch basato sulla major.minor version delle distribuzioni di Java.

Nel caso in cui provassimo ad eseguire un jar compilato con Java 7 su una JVM 6, riceveremmo la seguente eccezione:

Exception in thread "main" java.lang.UnsupportedClassVersionError: NomeClasseMain: Unsupported major.minor version 51.0
        at java.lang.ClassLoader.defineClass1(Native Method)
        at java.lang.ClassLoader.defineClassCond(Unknown Source)
        at java.lang.ClassLoader.defineClass(Unknown Source)
        at java.security.SecureClassLoader.defineClass(Unknown Source)
        at java.net.URLClassLoader.defineClass(Unknown Source)
        at java.net.URLClassLoader.access$000(Unknown Source)
        at java.net.URLClassLoader$1.run(Unknown Source)
        at java.security.AccessController.doPrivileged(Native Method)
        at java.net.URLClassLoader.findClass(Unknown Source)
        at java.lang.ClassLoader.loadClass(Unknown Source)
        at java.lang.ClassLoader.loadClass(Unknown Source)
        at java.lang.Class.forName0(Native Method)
        at java.lang.Class.forName(Unknown Source)

Le informazioni che ci interessano sono quelle evidenziata in giallo:
  • java.lang.UnsupportedClassVersionError
  • Unsupported major.minor version 51.0

Java identifica con major.minor version un numero corrispondente alle versioni (con nome commerciale) di Java. Di seguito l'elenco del mapping:

major.minor version Java
51.0 7
50.0 6
49.0 5
48.0 1.4
47.0 1.3
46.0 1.2


Lo script seguente è basato sull'individuazione dell'eccezione "java.lang.UnsupportedClassVersionError" per poi, tramite il mapping major minor version (riportato in tabella), informare l'utente di quale versione JVM necessita per eseguire il nostro programma.

@echo off

java -jar MioJar.jar method %1 %2 2>> log.txt

IF  %ERRORLEVEL% NEQ 0 GOTO Error
echo bye bye
REM Cancello i file di logging
IF EXIST log.txt del log.txt > NUL
IF EXIST jvm_unsupported.txt del jvm_unsupported.txt > NUL
exit

:Error
set Java_46.0=1.2
set Java_47.0=1.3
set Java_48.0=1.4
set Java_49.0=1.5
set Java_50.0=1.6
set Java_51.0=1.7
echo --------------------
echo Si e' verificato un errore

REM Controllo se è un errore di JVM inferiore a quella con cui è stato compilato il JAR
REM cerco e memorizzo nel file jvm_unsupported.txt la riga in cui è presente la stringa UnsupportedClassVersionError
findstr /c:"UnsupportedClassVersionError" log.txt > jvm_unsupported.txt

REM Se l'ho trovata gestisco l'errore informando l'utente che la sua JVM non è idonea
IF %ERRORLEVEL%==0 (echo Controlla la versione della JVM:
REM split della stringa usando lo spazio come delimitatore
for /f "tokens=1-11 delims= " %%a in (jvm_unsupported.txt) do (
  REM Recupero dinamicamente il valore delle variabili Java_ definiti a inizio label :Error
  REM Sfrutto il valore numerico della versione di java recuperato alla fine della seguente riga dell'eccezione generata
  REM   java.lang.UnsupportedClassVersionError: NomeJar : Unsupported major.minor version 51.0

  SetLocal EnableDelayedExpansion
  REM %%k mi da il valore dell'11-esimo elemeno splittato. I due punti esclamativi e SetLocal EnableDelayedExpansion consentono di concatenare %%k a Java_ e valutarlo come variabile
  echo Richiesta JVM !Java_%%k!
  del jvm_unsupported.txt
)
)

REM Stampo le informazioni aggiuntive
echo Arg 1: %1 >> log.txt
echo Arg 2: %2 >> log.txt
echo --------------------
echo.
echo Log completo:
type log.txt
REM Cancello i file di logging
IF EXIST log.txt del log.txt > NUL
IF EXIST jvm_unsupported.txt del jvm_unsupported.txt > NUL


Commenti

Post popolari in questo blog

Arrotondamento e troncamento in Java

Eclipse: Shortcuts (scorciatoie) da tastiera

Strutture dati: List, Set, Map

Creare un eseguibile Java