with tutorial plugin modules generate create java history

tutorial - ¿Qué es classpath hell y es/was it was a problem for Java?



maven build jar with dependencies (5)

Hay muchas cosas buenas aquí http://mindprod.com/jgloss/classpath.html y http://java.sun.com/javase/6/docs/technotes/tools/windows/classpath.html

Solo he tenido problemas con classpaths cuando no estoy configurando estoy usando -cp. Tratar de descubrir cómo su software de terceros establece sus classpaths puede ser un dolor a veces.

¿Qué es classpath hell y es / was it was a problem for Java?



Creo que "infierno de clase" se refiere a la hora en que la ruta de clase de una aplicación Java solo se podía establecer mediante el uso de la variable de entorno CLASSPATH. Esto dio lugar a muchas aplicaciones que requieren cambios en la configuración global del sistema (diferente para cada sistema operativo), conflictos de versiones entre aplicaciones y confusión general.


El infierno de Classpath es una consecuencia desafortunada de la vinculación dinámica del tipo llevado a cabo por Java.

Su programa no es una entidad fija, sino el conjunto exacto de clases cargadas por una JVM en una instancia particular.

Es muy posible estar en situaciones donde la misma línea de comando en diferentes plataformas o incluso en la misma daría lugar a resultados completamente diferentes debido a las reglas de resolución.

Podría haber diferencias en las bibliotecas estándar (muy común). Las bibliotecas pueden estar ocultas entre sí (incluso se puede usar una versión anterior en lugar de una más nueva). La estructura del directorio podría desordenar la resolución. Una versión diferente de la misma clase puede aparecer en múltiples bibliotecas y se usará la primera, etc. Dado que Java, por especificación, usa una política encontrada por primera vez, las dependencias de pedido desconocidas pueden ocasionar problemas. Por supuesto, dado que esta es la línea de comando y es parte de la especificación, no hay advertencias reales.

Todavía es un gran problema. Por ejemplo, en Mac OS, el soporte horrible de Apple significa que la máquina termina con varias JVM y varios JRE, y nunca se pueden transferir cosas fácilmente de un lugar a otro. Si tiene varias bibliotecas compiladas contra versiones específicas pero diferentes de otras bibliotecas, podría tener problemas, etc.

Sin embargo, este problema no es inherente a Java. Recuerdo mi parte de situaciones DLL de infierno durante la programación de Windows en los años 90. Cualquier situación en la que tenga que contar con algo en el sistema de archivos para ensamblar su programa en lugar de tener un único ejecutable bien definido es un problema.

Sin embargo, los beneficios de este modelo todavía son excelentes, así que estoy dispuesto a tolerar este infierno. También hay pasos en la dirección correcta del lado de Sun. Por ejemplo, Java6 le permite simplemente especificar un directorio con jar en lugar de tener que enumerarlos.

Por cierto: Classpaths también es un problema si está utilizando un entorno que utiliza un cargador de clases no predeterminado. Por ejemplo, he tenido muchos problemas al ejecutar cosas como Hibernate o Digester en Eclipse porque los cargadores de clases eran incompatibles.


Este es un ejemplo algo más concreto:

Cuando dos bibliotecas (o una biblioteca y la aplicación) requieren versiones diferentes de la misma tercera biblioteca. Si ambas versiones de la tercera biblioteca usan los mismos nombres de clase, no hay forma de cargar ambas versiones de la tercera biblioteca con el mismo cargador de clases.

Tome un botín en http://en.wikipedia.org/wiki/Java_Classloader#JAR_hell para más ejemplos.