Gestire varie versioni di Java/JDK sulla stessa macchina

Come partire da una situazione incasinata con molte versioni di Java e diversi JDK e fare ordine con SDKMAN.

Prendo spunto dall’articolo di Gunter Rosaert di DZone.

Situazione di partenza

Ecco quello che ho a bordo della mia macchina Linux:

$ lsb_release -a
No LSB modules are available.
Distributor ID:	Ubuntu
Description:	Ubuntu 21.10
Release:	21.10
Codename:	impish

$ update-alternatives --list java
/usr/lib/jvm/java-11-openjd-amd64/bin/java
/usr/lib/jvm/java-8-openjd-amd64/jre/bin/java
/usr/lib/jvm/jd1.8.0_202/bin/java
/usr/local/java/jre1.8.0_73/bin/java

Premetto che mi servono tutte queste versioni per fare girare diversi client di epoca diversa come:

  • Mirth Connect, versioni 2.8, 3.2, 3.5
  • Oracle SqlDeveloper

Poi ho la IDE, Intellij IDEA, che si porta appresso un’altra versione

$ ls .jdks/
openjdk-17

SDK

Ho già una versione di sdk a bordo ma deve essere aggiornata:

$ sdk version
==== BROADCAST =================================================================
* 2022-04-12: quarkus 2.8.0.Final available on SDKMAN! https://github.com/quarkusio/quarkus/releases/tag/2.8.0.Final
* 2022-04-11: neo4jmigrations 1.5.4 available on SDKMAN! https://github.com/michael-simons/neo4j-migrations/releases/tag/1.5.4
* 2022-04-10: jreleaser 1.0.0 available on SDKMAN! https://github.com/jreleaser/jreleaser/releases/tag/v1.0.0
================================================================================

SDKMAN 5.14.3


ATTENTION: A new version of SDKMAN is available...

The current version is 5.15.0, but you have 5.14.3.

Would you like to upgrade now? (Y/n): 

Scelgo di fare l’update, che risulta velocissimo:

Updating SDKMAN...
######################################################################## 100,0%
Install scripts...
sdkman_auto_answer=false
......

Successfully upgraded SDKMAN!

Open a new terminal to start using SDKMAN 5.15.0.

To join our BETA channel, simply follow the instructions on:

   http://sdkman.io/install

Enjoy!!!

Lista dei JDK

Una lista completa di tutte versioni di Java esistenti si ottiene con il comando sdk list. In particolare si possono vedere tutti i tool installabili, da Ant a Tomcat a Grails e a Groovy; l’output è rediretto a less così da poter navigare e accedere anche al menu (stampato in alto):

$ sdk list
================================================================================
Available Candidates
================================================================================
q-quit                                  /-search down
j-down                                  ?-search up
k-up                                    h-help

--------------------------------------------------------------------------------
Apache ActiveMQ (Classic) (5.16.2)                  https://activemq.apache.org/

Apache ActiveMQ® is a popular open source, multi-protocol, Java-based message
.....

                                                          $ sdk install activemq
--------------------------------------------------------------------------------
Ant (1.10.12)                                            https://ant.apache.org/

Apache Ant is a Java library and command-line tool whose mission is to drive
...

                                                               $ sdk install ant
--------------------------------------------------------------------------------

eccetera. Vengono listati tutti i tool con descrizione e relativo comando di installazione. Aggiungendo il parametro java invece vengono listate tutte le versioni di Java installabili (da Java.net, a Oracle, a Amazon, a versioni Unclassified) e vengono rilevate quelle installate nel sistema:

================================================================================
Available Java Versions for Linux 64bit
================================================================================
 Vendor        | Use | Version      | Dist    | Status     | Identifier
--------------------------------------------------------------------------------
 Corretto      |     | 18           | amzn    |            | 18-amzn             
               |     | 17.0.2.8.1   | amzn    |            | 17.0.2.8.1-amzn
................................................................................   
 Temurin       |     | 18           | tem     |            | 18-tem              
               |     | 17.0.2       | tem     |            | 17.0.2-tem          
               | >>> | 11.0.14      | tem     | installed  | 11.0.14-tem         
 Unclassified  |     | openjdk11    | none    | local only | openjdk11           
               |     | jdk1.8.0_202 | none    | local only | jdk1.8.0_202        
================================================================================

Ho limitato la lunga lista alle prime righe e alle versioni che ho effettivamente installato.

Se si vuole installare una versione si digita sdk install java [TAB] e compare la lista

sdk install java options
sdk install java options

Insomma… pare sufficiente come scelta, no? 🙂

Scegliere la JDK di default

In questo momento io ho attiva questa versione

$ java --version
openjdk 11.0.14 2022-01-18
OpenJDK Runtime Environment Temurin-11.0.14+9 (build 11.0.14+9)
OpenJDK 64-Bit Server VM Temurin-11.0.14+9 (build 11.0.14+9, mixed mode)

Per uniformità con gli ambienti di sviluppo degli altri miei colleghi ho intallato la Temurin 11.0.14.

Posso fare switch tra le varie versioni utilizzando il comando sdk default:

$ sdk default java 11.0.14-tem 

Default java version set to 11.0.14-tem

Si può anche cambiare il default per la sola sessione di terminale in cui sono:

$ sdk use java jdk1.8.0_202

Using java version jdk1.8.0_202 in this shell.

Se cito una versione che non è a bordo, mi dice di installarla prima:

$ sdk default java 17.0.2-tem 

Stop! Candidate version is not installed.

Tip: Run the following to install this version

$ sdk install java 17.0.2-tem

Posso controllare la diversa versione in uso nelle due diverse sessioni di terminale:

[Terminale 1]
$ echo $JAVA_HOME 
/home/marcob/.sdkman/candidates/java/current

[Terminale 2]
$ echo $JAVA_HOME
/home/marcob/.sdkman/candidates/java/jdk1.8.0_202

Ora si potrebbe fare pulizia delle versioni non in uso. Però, attenzione, ho altro software da far funzionare.

Ad esempio mi collego ad un server Mirth di un cliente con il client MirthConnect 3.2.0 che usa Java WebStart 11.202.2, il quale insiste su JRE 1.8.0_73-b02 Java HotSpot(TM) 64-Bit Server VM, che è l’ultima indicata nelle alternatives.

Anche il client MirthConnect Administrator 3.5.2 utilizza lo stesso JRE.

Configurare il JDK da usare per il build in Intellij

Ora il passaggio fondamentale è questo: configurare il kit da usare con l’IDE (per me Intellij IDEA). Può essere fatto a livello globale (per tutti i progetti) o per progetto (si può derogare dallo standard e prenderne una specifica per un progetto). Il build non presenta particolari problemi. Il problema bloccante si manifesta invece all’avvio dell’applicazione (run app).

Ottengo infatti questo un errore bloccante:

/home/marcob/.jdks/openjdk-17/bin/java
...
Failed to compile intellij-command-proxy.groovy: BUG! exception in phase 'semantic analysis' in source unit 'intellij-command-proxy.groovy' Unsupported class file major version 61 (Use --stacktrace to see the full trace)

Ma come si vede in realtà il kit utilizzato per esegue l’applicazione non è quello che abbiamo installato.

Si può definire un kit di default per tutti i progetti Java creati cona IDE raggiungendo questa voce dal menu: File > Project Structure e selezionare la voce SDKs sotto “Platform Settings” nel menu di sinistra:

Selezionare la JDK di default per i nuovi progetti Grails
Selezionare il SDK di default per i nuovi progetti Grails

Quindi devo recarmi nelle impostazioni del progetto IntelliJ e compiere queste due oprazioni: File > Project Structure e selezionare la voce Project sotto “Project Settings” nel menu di sinistra:

Project JDK come da impostazione SDK
SDK di progetto

Nella selezione SDK seleziono temurin-11.

La SDK di solito va impostata quando si crea il progetto:

Impostazione generale della JDK per l'intera IDE
Impostazione generale della SDK per l’intera IDE

Se si vuole usare la Temurin per tutti i progetti, bisogna impostare il SDK Globale con la voce Platform Settings > SDKs nel menu di sinistra (nota: se vedete differenze in queste schermate rispetto alla vostra IDE, la mia versione è IntelliJ IDEA 2021.3.3 (Ultimate Edition)):

Risorse web

Lascia un commento

Il tuo indirizzo email non sarà pubblicato.

Questo sito utilizza Akismet per ridurre lo spam. Scopri come vengono elaborati i dati derivati dai commenti.