Mettere i jar esterni nella directory JAVA_HOME / lib / ext è una cosa brutta?

Abbiamo un’applicazione che viene eseguita in un ambiente JRE. L’applicazione utilizza alcuni jar esterni e li abbiamo inseriti nella cartella JAVA_HOME / lib / ext. Questo ha funzionato per noi da anni ma recentemente un nuovo programmatore si è unito al nostro team e sembra enfatico che questo sia un po ‘come una brutta cosa da fare. Non riesco a capire perché e sto cercando di fare qualche ricerca prima di approfondire ulteriormente con questo sviluppatore. C’è qualcosa che mi manca qui?

Sì, è una brutta cosa Pensaci: l’applicazione dipende dal JRE e da alcuni barattoli in più. Cosa succede se aggiorni JRE? Quindi devi ricordarti di copiare i file nel nuovo JRE. Cosa succede se è necessario configurare l’applicazione su un nuovo sistema? Devi copiare l’applicazione lì, e poi ricorda anche di copiare i vasi esterni nel JRE su quel sistema.

Entrambi questi problemi non sarebbero affatto un problema se si confeziona l’applicazione correttamente insieme ai jar esterni necessari. Se non lo vedi, forse non è affatto un problema. Ma dovresti comunque essere grato per il nuovo ragazzo per aver condiviso la sua opinione.

Oltre alla risposta di weiji (imballaggio e aggiornamenti alle nuove versioni di JVM), ci sono altri rischi.

Se si utilizza il gestore della sicurezza in una qualsiasi delle applicazioni, le librerie in ext hanno spesso molte più funzionalità per impostazione predefinita – vengono trattate in modo molto simile alle librerie di sistema. Devi essere sicuro di poterti fidare, nel senso di far rispettare le regole di sicurezza, queste classi. Gli autori hanno pensato a quello che stavano esponendo correttamente? Se queste classi non utilizzano il controllo di accesso per modificare il contesto di sicurezza, non devi preoccuparti di questo, ma sai se lo fanno o no (ad esempio un metodo che fornisce l’accesso a un file e utilizza AccessController, non garantisce che il chiamante ha i permessi file giusti?)

Tutte le tue applicazioni possono utilizzare la stessa identica versione della libreria? Cosa succede quando devi aggiornare quella libreria (non solo la JVM)? Interromperete una qualsiasi delle vostre applicazioni? Sarà necessario ripetere il test di tutto. Le librerie in ext sono caricate dal programma di caricamento della class estensione che, a causa della delega dei genitori, ha una precedenza più alta rispetto al caricatore normale (cioè CLASSPATH), quindi è garantito che vengano utilizzate dall’applicazione e non è ansible sovrascrivere una singola applicazione la libreria in ext con una versione diversa.

Se si desidera condividere le librerie tra le applicazioni, perché non fornire una cartella separata di librerie comuni che le applicazioni possono essere configurate singolarmente (CLASSPATH) come riferimento. Quindi, se hai problemi con un’applicazione e una libreria, puoi passare a una versione diversa delle librerie o solo a quella, metterla prima in CLASSPATH (se funziona, devi testare anche questo perché potrebbe esserci un’altra dipendenza problemi). Ciò ti consentirà di avere più controllo individuale per ogni applicazione. Tuttavia, il raggruppamento di tutte le librerie richieste con l’applicazione è il più sicuro in quanto è ansible ripetere il test e aggiornare gli aggiornamenti delle librerie alle singole applicazioni.

Inoltre sembra che JEP-220 stia deprecando apparentemente questo comportamento con alcuni mezzi arbitrari per “eventualmente sostituirlo” con qualche altro comportamento.