2012-03-06 14 views
9

Cuando trato de resolver this problem, me encontré con algunos artículos, etc. refiriéndome a ClassLoaders "aislados". No pude encontrar una definición para classloader aislado a través de la búsqueda de Google, por lo que tal vez el término no sea una jerga ampliamente conocida, y quizás tenga un significado diferente en diferentes contextos.¿Qué es un cargador de clases aislado en Java?

De todos modos, el plugin de Maven segura puede utilizar un cargador de clases aisladas: http://maven.apache.org/plugins/maven-surefire-plugin/examples/class-loading.html

También una de las respuestas a continuación las referencias an article explaining how to create an "isolated" ClassLoader.

Ninguna de las referencias anteriores proporciona una definición para un ClassLoader aislado; parecen suponer que el lector sabe lo que eso significa o puede buscarlo. Sin embargo, el segundo enlace incluye una pista sobre lo que significa "aislado":

Bootstrapping le permite ejecutar su contenedor sin contaminar el classpath del sistema. Esto le permite ejecutar sus aplicaciones desplegadas con el classpath del sistema no contaminado como su principal. Has logrado el aislamiento del cargador de clases.

Pero no estoy del todo claro sobre qué está aislado de qué y cómo de este párrafo o el resto del artículo. Veo que está cargando una versión de una clase sin sobrescribir/sobreescribir otra versión. ¿Tal vez un cargador de clases está aislado de otro por ser instancias diferentes sin que uno sea el padre del otro? No estoy seguro.

Especialmente codician un enlace de búsqueda de Google o SO que contiene un enlace que contiene claramente la respuesta. Un enlace directo a una respuesta también funciona. :)

+0

Proporcione un enlace o una cita que dé contexto a su pregunta. (Por cierto, ¿no es la codicia un pecado? :-)) –

+0

@Stephen: Te agradeceríamos que dejes tu fanatismo religioso afuera cuando entres. –

+2

Bueno, sabemos por Larry Wall que las tres grandes virtudes de un programador son la pereza, la impaciencia y la arrogancia, y dado que la codicia no es una virtud, debe ser un pecado. Ahí vas. –

Respuesta

8

El autor utiliza el término "aislamiento" básicamente para significar que el cargador de clases de arranque para la JVM (el cargador de clases "principal") no tiene ningún jars/clases adicionales (solo una clase simple que a su vez establece el cargador de clases hijo). El artículo no es muy obvio en cuanto a por qué está "aislado" porque solo configura un cargador de clases hijo. El término "aislamiento" se vuelve más obvio cuando configura más de un clasificador de clases hijo. Estos niños estarán aislados el uno del otro en el sentido de que no compartirán ninguna clase de (que no sean las clases básicas de JRE). Por lo tanto, puede hacer cosas como hacer que cada niño use una versión diferente del mismo frasco.

+0

Por ejemplo: classloader1 = new URLClassLoader (oneUrl, parent); classloader2 = new URLClassLoader (anotherUrl, parent); crearía 2 cargadores de clases aislados de ea. otro, cada uno capaz de tener diferentes versiones de una clase dada (y tal vez tenga otros usos), ¿correcto? – apollodude217

+1

@ apollodude217 - sí, eso es correcto. Sin embargo, el bit clave es que ni oneUrl ni anotherUrl deben hacer referencia a las clases cargadas por el cargador de clases principal (de ahí que el ejemplo ejecute el cargador de clases principal sin tarros adicionales). – jtahlborn

2

Aquí está how to create an isolated classloader, crearía uno cada vez que desee un classpath no contaminado del sistema, útil para iniciar programas Java.

+0

Este fue en realidad uno de los artículos que leí al tratar de buscar lo que es un cargador de clases aislado, y no me queda claro por el contexto de qué se trata. Veo lo que hace el autor, pero no sé qué parte de eso hace que su cargador de clases esté "aislado". – apollodude217

1

Desde mi comprensión del artículo que ha vinculado a que un cargador de clases aislado es un cargador de clases que está separado del cargador de clases del sistema principal. Es decir, las clases cargadas por el cargador de clases aislado no estarán disponibles para todas las clases en JRE (solo las que cargó el cargador de clases aislado [y cualquier clase cargada por cualquier cargador de clase secundaria]).

Esto podría ser útil porque dos de sus dependencias pueden requerir versiones diferentes de la misma biblioteca para ejecutarse. Es decir, sus dependencias pueden esperar ver diferentes instancias de la misma clase en la biblioteca. Por lo tanto, al proporcionarles dos cargadores de clases independientes, se les permitirá cargar las clases que requieren y no interferir entre sí.

Cuestiones relacionadas