2012-03-06 5 views
9

Durante il tentativo di risolvere this problem, ho riscontrato alcuni articoli, ecc. Che si riferiscono a ClassLoader "isolati". Non sono riuscito a trovare una definizione per il classloader isolato tramite la ricerca Google, quindi forse il termine non è un gergo ampiamente noto e forse ha un significato diverso in contesti diversi.Che cos'è un classloader isolato in Java?

In ogni caso, plug infallibile di Maven può utilizzare un ClassLoader isolato: http://maven.apache.org/plugins/maven-surefire-plugin/examples/class-loading.html

anche una delle risposte al di sotto riferimenti an article explaining how to create an "isolated" ClassLoader.

Nessun riferimento sopra fornisce una definizione per un ClassLoader isolato; sembrano presupporre che il lettore sappia cosa significa o può cercarlo. Tuttavia, il secondo link include un suggerimento su cosa significa "isolato":

Il bootstrap consente di eseguire il contenitore senza inquinare il classpath di sistema. Ciò consente di eseguire le applicazioni distribuite con il classpath di sistema non protetto come padre. Hai raggiunto l'isolamento del classloader.

Ma non sono abbastanza chiaro su cosa sia isolato da cosa e come da questo paragrafo o dal resto dell'articolo. Vedo che sta caricando una versione di una classe senza sovrascrivere/sovrascrivere un'altra versione - forse un classloader è isolato da un'altra essendo istanze diverse senza che uno sia il genitore dell'altro? Non ne sono sicuro.

Desidero in particolare un collegamento di ricerca Google o SO che contenga un collegamento che contiene chiaramente la risposta. Funziona anche un link diretto a una risposta. :)

+0

Si prega di fornire un link o un preventivo che dia contesto alla tua domanda. (A proposito, non è un peccato peccato? :-)) –

+0

@Stephen: Apprezzeremmo se tu lasciassi il tuo fanatismo religioso fuori quando entri. –

+2

Bene, sappiamo da Larry Wall che le tre grandi virtù di un programmatore sono la pigrizia, l'impazienza e l'arroganza, e poiché la cupidigia non è una virtù, deve essere un peccato. Quindi eccoti. –

risposta

8

L'autore sta usando il termine "isolamento" in sostanza per indicare che il programma di caricamento di classe bootstrap per JVM (il classloader "principale") non contiene alcun jar/classe in più (solo una classe semplice che a sua volta imposta up the child classloader (s)). L'articolo non è del tutto ovvio sul motivo per cui questo è "isolato" perché imposta solo un classloader figlio. Il termine "isolamento" diventa più evidente quando si imposta più di un classloader figlio. Questi bambini saranno isolati gli uni dagli altri in quanto non condivideranno alcuna classe (diversa dalle classi JRE principali). Quindi, puoi fare cose come avere ogni bambino usare una versione diversa dello stesso vaso.

+0

Ad esempio: classloader1 = new URLClassLoader (oneUrl, parent); classloader2 = new URLClassLoader (anotherUrl, parent); creerebbe 2 classloader isolati da EA. altri, ognuno in grado di avere versioni diverse di una determinata classe (e forse hanno altri usi), corretto? – apollodude217

+1

@ apollodude217 - sì, è corretto. il bit chiave, tuttavia, è che néUrl né anotherUrl devono fare riferimento alle classi caricate dal programma di caricamento classi genitore (quindi l'esempio esegue il classloader principale senza giare extra). – jtahlborn

2

Ecco lo how to create an isolated classloader, lo creeresti ogni volta che vuoi un percorso di classe di sistema non inquinato, utile per avviare programmi Java.

+0

Questo era in realtà uno degli articoli che ho letto quando cercavo di vedere cosa fosse un classloader isolato, e non mi è chiaro dal contesto di cosa si tratti. Vedo ciò che l'autore sta facendo, ma non so quale parte di ciò renda il suo classloader "isolato". – apollodude217

1

Dalla mia comprensione dell'articolo a cui si è collegato un caricatore di classe isolato è un caricatore di classi che è separato dal caricatore di classe del sistema principale. Cioè, le classi caricate dal programma di caricamento classe isolato non saranno disponibili per ogni classe in JRE (solo quelle che il programma di caricamento classe isolato ha caricato se stesso [e qualsiasi classe caricata da qualsiasi programma di caricamento classe figlio]).

Questo potrebbe essere utile perché due delle vostre dipendenze potrebbero richiedere l'esecuzione di versioni diverse della stessa libreria. Cioè, le tue dipendenze potrebbero aspettarsi di vedere diverse istanze della stessa classe nella libreria. Quindi dare loro due distinti caricatori di classe isolata permetterà loro di caricare le classi di cui hanno bisogno e non interferire l'uno con l'altro.