Venerdì sono stato al meetup organizzato da Fabrizio Marini presso Oracle a Roma, con titolo Java 10 & Novità : Moduli, performances, docker awareness. Questo è il mio resoconto su alcune delle interessanti novità di cui si è parlato al meetup.
OpenJDK e Oracle JDK
OpenJDK è l’alternativa opensource di Java. Dalla versione 7, OpenJDK è l’implementazione di riferimento di Java. Ciò vuol dire che, il codebase di Oracle JDK e OpenJDK sono gli stessi.
Sono rimasto felicemente stupito da questa notizia, in quanto amante dell’open source e per il fatto che spesso molti sistemi basati su Java richiedano la versione Oracle rendendo l’alternativa open poco attraente.
Java Long Time Support
Il nome delle versioni di Java prenderanno un formato mese-anno
di release, con nuove versioni disponibili ogni 6 mesi.
Mentre le versioni 9 e 10 sono il “limbo” di Java, ovvero sono già considerate deprecate, la versione 18.9 prevista per settembre sarà una LTS: Oracle offrirà supporto commerciale con patch e aggiornamenti 3 anni.
Questo vuol dire che, dietro pagamento, verranno fornite patch di sicurezza che altrimenti troveremo gratuitamente (oltre ad aggiornamenti che potrebbero introdurre nuovi bugs o rompere la retrocompatibilità) nelle versioni successive (es. 19.3).
L’azienda adoptopenjdk si è prefissata come obiettivo il supporto LTS alle varie versioni di Java, in modo da eguagliare i tempi di Oracle.
Novità di Java 8
In breve, alcune delle features introdotte in Java 8:
- Le lambda: funzioni anonime, che permettono di scrivere codice più compatto,
- L’operatore
::
: Che permette di riferirsi a metodi di classi da utilizzare come funzioni lambda,
- L’operatore
- Metodi di Default: per le interfacce, come per le classi abstract,
- Streams: Utilissimi per le operazioni parallele (map-filter-reduce),
- API per tempo e data: Integrazione di yodatime. Finalmente.
Novità di Java 9
In breve, alcune delle features introdotte in Java 9:
- Moduli: more on this later
- Reactive Streams API: per reactive programming
- Supporto a HTTP/2
- G1: un deterministic Garbage Collector
- Jshell: Un repl per Java,
Novità di Java 10
In breve, alcune delle features introdotte in Java 10:
- Var: permette di dichiarare variabili usando la type inference (e.g.
var foo = "Hello";
) - Docker awareness,
- GraalVM: compilatore just in time poliglotta,
- HttpClient: asincrono e con supporto WebSockets.
Java Mission Control – JMC
Permette di fare l’analisi di un’applicazione in esecuzione sulla JVM, con consigli di ottimizzazione e indicazione di possibili problemi.
Mentre prima era un prodotto a pagamento, Oracle come altre aziende di recente si sta muovendo verso l’open source e questo tool dovrebbe essere presto essere disponibile tramite OpenJDK.
E’anche possibile, tramite licenza commerciale, sfruttare il programma per eseguire il debug di JVM da remoto.
Sui moduli
I moduli offrono:
- Configurazione affidabile: un modo per sostituire il meccanismo basato su classpath, e permettere ai componenti di dichiarare esplicitamente le proprie dipendenze (
ClassDefNotFoundError
anybody?) - Strong encapsulation: Permette ai componenti di dichiarare i proprio tipi pubblici ed accessibili dagli altri componenti.
I moduli sono una delle novità più importanti in effetti: l’intero JDK è stato riscritto utilizzando i moduli.
Un’importante tool presentato durante l’evento da Fabrizio, è jlink
.
Partendo dal progetto del nostro programma, è possibile creare un JRE minimale capace di eseguirlo. Questo è possibile grazie al sistema di dipendenze creato dai moduli.
A che serve questo JRE minimale? Una delle architetture più innovative, prende il nome di architettura a microservizi: per creare un sistema scalabile, si creano componenti che possono essere facilmente replicati per andare incontro ad una crescente quantità di traffico (scalabilità orizzontale).
Per poter replicare un microservizio, l’orchestratore deve scaricare l’immagine docker dell’applicazione, ed instanziarla su un host con sufficiente capacità.
Avere un immagine minimale, ci consente di:
- Pagare di meno: lo spazio per archiviare l’immagine, e lo spazio necessario sull’host che dovrà eseguirla
- Ridurre il tempo di istanziazione: Immagini più leggere richiedono meno tempo di trasferimento.
A parte questo, avere un’immagine minimale è utile anche nel campo IoT/sistemi embedded.
GraalVM
Graal è secondo me un’altra importante novità presentata durante l’incontro. Graal permette di compilare diversi linguaggi fra cui Java, Python e C in un eseguibile senza dipendenze.
Mentre non è ancora uscita la versione 1 ufficiale, è possibile scaricare da Github la versione 1.0-RC3.
Conclusioni
Ci aspettano molte novità per quanto riguarda Java, in questo articolo ho elencato solamente quelle che personalmente ritenevo più interessanti. Per una overview più completa, da cui ho preso gran parte delle informazioni di questo post, vi consiglio di dare un’occhiata alla presentazione di Fabrizio Marini.
A questo link è possibile scaricare inoltre un file zip con esempi di codice presentati durante il workshop e una VM con tutto l’occorrente per eseguirli.