Qualche giorno addietro ho avuto la felice idea di aggiornare la versione di OpenJDK dalla 11.0.5 alla 11.0.6. Sembrava che tutto filasse per il verso giusto ma sono stato colpito dal famoso proverbio
Non lasciare la vecchia strada per quella nuova
All’avvio di Liferay Portal 7.2 GA2 CE eccoti apparire l'errore abbastanza odioso indicato a seguire (in console 1).
Dopo qualche mirata ricerca ho scoperto che l'errore è dovuto ad un bug (ancora aperto) sulla OpenJDK 11.0.6 JDK-8237875 (zipfs) DirectoryStream entries changed behavior between JDK 11.0.5 and JDK 11.0.6
Liferay dal canto suo ha provveduto a risolvere, anche velocemente, tramite LPS-107983 - OpenJDK 11.0.6 compatibility problem. Questa LPS risulta già chiusa e risolve il problema sul branch 7.x e master.
Come possiamo applicare la patch dell'LPS senza aspettare l'uscita della nuova GA?
Le possibili soluzioni sono:
- Downgrade di OpenJDK alla versione 11.0.5;
- Se disponiamo della DXP siamo nelle condizioni di richiedere supporto direttamente a Liferay;
- Se disponiamo della CE possiamo applicare la patch in modo autonomo.
La prima strada non è sempre percorribile a causa del fatto che il più delle volte l’aggiornamento della JDK rientra tra uno di quei componenti il cui aggiornamento è centralizzato e abbiamo per cui poco spazio di manovra.
La seconda strada è semplice da percorre e solitamente in pochi giorni si ottiene la Hot Fix.
Per non farci mancare nulla, direi di scegliere la terza strada, che poi è quella più interessante.
1. Come applicare la patch
Vediamo come sia possibile e semplice applicare la patch a Liferay Portal CE. La versione di riferimento è Liferay Portale CE 7.2.1 GA2.
Come possiamo applicare la nostra Hot Fix anche sulla CE? La risposta è davvero semplice: Overriding lpkg files.
Il bundle a cui dobbiamo applicare la patch 84189 è Liferay Portal OSGi Web Servlet JSP Compiler (com.liferay.portal.osgi.web.servlet.jsp.compiler) che fa parte dell’LPKG Liferay CE Static - Impl.lpkg. In questo caso possiamo quindi applicare l’Overriding lpkg files, anche a quelli Static.
La procedura da seguire è:
- Creare il bundle in formato jar contenente la patch;
- Il nome del bundle deve essere uguale all'originale, meno le informazioni sulla versione;
- Copiare il file .jar del bundle nella cartella
$LIFERAY_HOME/osgi/static
; - Rimuovere del contenuto della directory
$LIFERAY_HOME/osgi/state
; - Avviare Liferay Portal. Notare che ogni volta che si aggiungono e rimuovono .jars in questo modo, è necessario chiudere e riavviare Liferay Portal per rendere effettive le modifiche.
Se è necessario ripristinare le personalizzazioni, eliminare i file .jar di sostituzione: Liferay Portal utilizzerà il file .jar originale al successivo avvio.
Sembra tutto molto chiaro!
Come facciamo a creare il nuovo bundle che conterrà la patch dell’LPS-107983? Lo vedremo nel prossimo capitolo.
2. Come creare il bundle con la patch
Per creare il nuovo bundle sono necessari i sorgenti e per ottenerli esistono essenzialmente due modi che sono:
- Clone dei sorgenti di Liferay Portal 7.2.1 GA1 dal repository GitHub;
- Ottenere i sorgenti dal repository Maven com.liferay.portal.osgi.web.servlet.jsp.compiler versione 4.0.14.
La scelta della prima strada potrebbe richiedere parecchio tempo per via del
clone del repository che anche se eseguito con l’opzione --depth 1
richiede del tempo.
Personalmente ho scelto la seconda strada, che in pochi minuti ci consentirà di ottenere il bundle con la patch. A seguire tutti gli step necessari (e non serve nessun IDE). Ecco l'elenco dei macro task:
- Creazione di un Liferay Workspace via blade;
- Creazione della struttura di directory per il modulo
portal-osgi-web-servlet-jsp-compiler
; - Copiare dei sorgenti dal bundle jar scaricato dal repository Maven all’interno del modulo su Liferay Workspace;
- Scaricare il bnd.bnd dal repository GitHub di Liferay e posizionarlo sulla root del modulo;
- Scaricare il build.gradle dal repository GitHub di Liferay e posizionarlo sulla root del modulo;
- Modificare il build.gradle per aggiungere FileUtil (com.liferay.gradle.util.FileUtil);
- Applicare la patch 84189;
- Eseguire la build del modulo;
- Accertarsi che il portale sia spento;
- Installare il modulo in
$LIFERAY_HOME/osgi/static
; - Avviare il portale.
Il set di comandi mostrati a seguire realizzano i punti da 1 a 5. Se volete risparmiare anche questo tempo, allora potete attingere direttamente al repository che ho predisposto ad hoc https://github.com/smclab/apply-lps-107983-openjdk-11-0-6
Il punto 6 richiede la modifica del file build.gradle, questo è necessario affinché non otteniate l’errore mostrato a seguire.
Per evitare l’errore occorre aggiungere sul file build.gradle il contenuto mostrato a seguire.
A questo punto siamo nelle condizioni di poter applicare la patch nel seguente modo.
Se tutto va come deve, dovreste vedere un output simile a quello mostrato nella figura seguente.
Una volta applicate possiamo procedere con la build del bundle utilizzando il classico comando build
A portale spento, copiamo il nuovo bundle (senza la versione) all’interno
della directory $LIFERAY_HOME/osgi/static/
A questo punto, dopo aver eliminato il contenuto della directory
$LIFERAY_HOME/osgi/state
, avviamo il portale. Fate attenzione ai log di Liferay
perchè dovreste vedere le seguenti righe di log che indicano l’avvenuta
installazione del nuovo bundle che va in override all’esistente.
Appena il portale è in piedi, eseguite il deploy di una qualunque portlet MVC e verificate di non ottenere più errori di compilazione sulle JSP. Le figure a seguire mostrano la home page del portale Liferay prima e dopo l’installazione del bundle con la patch.
In questi casi, quando andiamo a fare il patch di componenti Liferay, è consigliabile metterlo in evidenza, per esempio con opportuna indicazione sul Bundle Name.
Benissimo! Adesso abbiamo il nostro Portale Liferay 7.2 GA2 che funziona con OpenJDK 11.0.6
3. Conclusioni
In questo articolo abbiamo visto come sia semplice applicare una patch ad un componente core di Liferay senza la necessità di attendere la prossima release. Tutto questo è reso possibile per tre semplici motivi:
- Liferay è Open Source;
- Liferay dalla versione 7.0 ha adottato in toto OSGi, ergo, il benvenuto alla modularità ;
- Liferay ha sviluppato in set di framework che ne facilitano l'estensione, anche dei componenti core del portale.
Prima di buttare la spugna quanto incontrate un problema che potrebbe sembrare insormontabile, vi consiglio sempre di consultare la documentazione di Liferay dove nella maggior parte dei potreste trovare la soluzione al vostro problema.