Curiosità: incompatibilità tra Oracle JRE 1.8 e OpenJDK Runtime Environment 1.8

di il
5 risposte

Curiosità: incompatibilità tra Oracle JRE 1.8 e OpenJDK Runtime Environment 1.8

Buongiorno a tutti.
Prima di esporre il problema faccio una doverosa premessa: per quanto mi riguarda il problema non si pone poichè la JRE la decido io e, di conseguenza, installo la Oracle JRE e me ne frego.

Passiamo ai fatti: dopo aver letto numerosi sermoni sul fatto che "all'utente finale non cambia nulla perchè tanto i sorgenti di OpenJDK sono gli stessi usati da Oracle, bla bla bla", incappo in un evidente problema di incompatibilità tra le due "versioni".

Mi sono ritrovato a dover installare un mio software sulla macchina di un mio utente il quale aveva già scaricato ed installato la JRE per i fatti suoi. Non è la prima volta che accade, ma è la prima volta che mi ritrovo installato la JVM di OpenJDK al posto di quella Oracle. Per la precisione OpenJDK Runtime Environment 1.8.

Memore dei sermoni di cui sopra, non mi preoccupo e proseguo.

Provo ad avviare e... sorpresa. L'applicazione non parte.

Ora, senza entrare nei dettagli, si tratta di un'applicazione piuttosto complessa che fa uso, tra le altre cose, di un database JavaDB gestito tramite Hibernate e, per alcune features, fa uso di diversi Web Services.

Il problema sembra avere origine proprio da Hibernate: viene lanciata una bellissima NoClassDefFoundError durante la fase di configurazione perchè non trova la StaticLoggerBinder... faccio qualche ricerca e pare che la cosa si possa risolvere agevolmente aggiungendo la libreria SLF4J (del tutto inutile per l'applicazione visto che la fase di logging la gestisco io in altro modo, ma fa nulla), ma pare sia necessaria una specifica versione, che credo non sia compatibile con le versioni precedenti della JRE (non ho provato, ma se così fosse mi creerebbe alcuni problemi su altre macchine [non sto a spiegare perchè]).

Faccio di testa mia, installo la Oracle JRE 1.8 (quindi, stessa versione, ma di famiglia diversa), e tutto funziona come un orologio.

Nota Bene: i compilati sono gli stessi, le librerie pure. Cambia solo la VM che li esegue.

A qualcun altro è capitato?

Ciao.

5 Risposte

  • Re: Curiosità: incompatibilità tra Oracle JRE 1.8 e OpenJDK Runtime Environment 1.8

    Normale amministrazione.
    Hai scoperto la mitica acqua calda

    Ma ATTENTO: NON CENTRA la vm, ma le librerie a corredo.

    E come dire: ho progettato il mio aggeggio per la Fiat costruita in Germania e la voglio installare su quella costruita in Inghilterra, ma, opps, quella in Inghilterra ha il volante dalla parte sbagliata.

    Bisogna SEMPRE avere il controllo dell'environment: o lo decidi tu, oppure cloni ESATTAMENTE quello del cliente, sopprattutto nei casi di sistemi complessi.

    Se il cliente usa la versione X, tu DEVI utilizzare la versione X, NON la Y, la X+1 o la X-2.
  • Re: Curiosità: incompatibilità tra Oracle JRE 1.8 e OpenJDK Runtime Environment 1.8

    Come ho premesso, la JRE la decido io. Punto. Non esiste "il cliente" in questo caso, ma "il mio utente". Quindi il problema non si pone.
    La mia era più una discussione in merito al fatto che ovunque si legge che OpenJDK is an official reference implementation of a Java Standard Edition since version SE 7, tanto per dire...

    E qui si sta parlando proprio di VM non di hardware. La stessa applicazione l'ho installata un po' su tutto (macchine Windows a partire dalla XP fino alla 10, Macchine Apple, macchine Linux) e ovunque funziona senza problemi. Qui cambia proprio la famiglia di JVM (nemmeno la versione, proprio solo la famiglia).

    E' evidente che Oracle e OpenJDK differiscono, ma non è ciò che mi sarei aspettato da una VM che dovrebbe essere una Official Referenze implementation of JSE...
  • Re: Curiosità: incompatibilità tra Oracle JRE 1.8 e OpenJDK Runtime Environment 1.8

    @LeleFT, tanto per dire NON HAI CAPITO il problema!

    StaticLoggerBinder NON E' PARTE di java.* o javax.*, o com.sun.*, quindi NON FA PARTE DI OpenJDK, ma e' una libreria di terze parti!
  • Re: Curiosità: incompatibilità tra Oracle JRE 1.8 e OpenJDK Runtime Environment 1.8

    migliorabile ha scritto:


    @LeleFT, tanto per dire NON HAI CAPITO il problema!

    StaticLoggerBinder NON E' PARTE di java.* o javax.*, o com.sun.*, quindi NON FA PARTE DI OpenJDK, ma e' una libreria di terze parti!
    In realtà il problema l'ho capito benissimo e ti garantisco che non c'entra nulla il fatto che tale classe non faccia parte della java.* o quel che vuoi (non voglio diventare antipatico, ma qualche decennio di esperienza alle spalle ce l'ho).
    Il vero problema è che c'è un comportamento diverso da parte di Hibernate a seconda della JVM usata: se viene usata la JVM di Oracle, in mancanza della libreria SLF4J Hibernate utilizza in default una implementazione NO-OP di tale libreria di logging (presente al suo interno e documentata). Lo stesso non accade se si usa la OpenJDK, quindi Hibernate (in questo caso) tenta di caricare una libreria che non esiste.

    Questo dovrebbe essere sufficiente a capire una cosa importante: Hibernate non è un prodotto sotto il mio controllo (non lo produco io), se uso una determinata versione di quella libreria, mi aspetto che funzioni secondo quanto riportato nella documentazione relativa (a meno di bugs, ovvio). In questo caso c'è un evidente comportamento differente della libreria (quindi non del mio software) a seconda della JVM usata (ora, non mi interessa nemmeno sapere se questa cosa è segnalata o meno nella documentazione di Hibernate, ripeto: non è un problema). Credo (è una mia supposizione) che ci sia qualcosa nella JVM di OpenJDK che fa sì che alla libreria venga data un'informazione errata, con le conseguenze che ho potuto vedere.

    La mia domanda in questa discussione era: "a qualcun altro è capitato qualcosa di simile?" ovvero, di avere un'applicazione Java perfettamente funzionante su una JVM di una determinata famiglia e notare che lo stesso non accade se si viene ad usare una JVM di una famiglia diversa che dovrebbe essere "compatibile"?

    Io ho constatato questo, ne prendo atto e vado avanti come sempre... nessun problema.

    PS: potrebbe anche essere un bug della libreria Hibernate (è vecchia quella che viene usata da quel programma e probabilmente nelle versioni successive può essere stato corretto).
  • Re: Curiosità: incompatibilità tra Oracle JRE 1.8 e OpenJDK Runtime Environment 1.8

    A me era capitato di peggio.

    Programma di interfaccia RS-232 per gli installatori, fatto in Java da consulente esterno, con Oracle JRE 1.7.XX tutto OK, da una certa JRE.1.7.YY in poi caduta di connessione dopo pochi secondi, su qualsiasi PC.
Devi accedere o registrarti per scrivere nel forum
5 risposte