2010-01-15 14 views
11

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 è entrato a far parte del nostro team e sembra enfatico che questo sia un po '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?Mettere oggetti jar esterni nella directory JAVA_HOME/lib/ext è una cosa brutta?

+11

Dagli un rilancio o almeno un bonus. Non nelle tue mani, parla con i gestori. Sul serio. –

risposta

18

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 rappresentano un problema se si compila 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.

+2

Dipende molto dall'uso personale/aziendale. Per me, è normale esaminare la directory ext dopo un aggiornamento per spostare spesso le librerie usate da qui a lì, ad esempio itext (creazione di PDF) o una libreria di grafici. Se esiste un conflitto di versione, ti piacerebbe conoscerlo presto e devi conoscerlo in entrambi i casi.Ma gli aggiornamenti minori nelle librerie per i bugfix sono più facili da gestire se li fai in un posto e non in più posti. Se c'è un programma che non può gestire una libreria così fissa, devi comunque risolverlo individualmente. –

+0

Totalmente d'accordo, ma ora il problema è cosa fare se molte delle mie applicazioni si affidano alla stessa libreria/jar. Non voglio mettere una copia del barattolo in ognuno di essi, perché se la libreria si aggiorna, dovrei cambiare il barattolo per tutte le mie applicazioni. Voglio mettere questo barattolo in un posto dove tutte le mie applicazioni possano accedervi. Esiste un posto del genere? O devo usare il classpath (il problema esiste se decido di spostare il jar, ho bisogno di cambiare classpath per tutte le mie applicazioni ...)? – Benitok

10

In aggiunta 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 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 applicazioni possono utilizzare la stessa 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 vengono caricate dal programma di caricamento classe estensione che, a causa della delega dei genitori, ha una precedenza superiore rispetto al caricatore normale (ad esempio CLASSPATH), quindi è garantito che vengano utilizzate dall'applicazione e non esiste alcun modo per una singola applicazione per ignorare la libreria in ext con una versione diversa.

Se si desidera condividere le librerie tra le applicazioni, perché non fornire invece 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 è possibile ripetere il test e aggiornare gli aggiornamenti delle librerie alle singole applicazioni.

1

Anche sembra che JEP-220 stia deprecando questo comportamento con alcuni mezzi arbitrari per "eventualmente sostituirlo" con qualche altro comportamento.

+0

- non trattenere il respiro! - –

+0

In realtà, gli aspetti Java SE del meccanismo di estensione sono stati deprecati in una versione di manutenzione di JSR 337 (JSR per Java SE 8) e quindi rimossi in Java SE 9/JDK 9. La riga di comando '-XX: + CheckEndorsedAndExtDirs' opzione è un'opzione utile per verificare se le applicazioni in esecuzione su JDK 8 dipendono da questa funzione. –

Problemi correlati