Tenemos una aplicación que se ejecuta en un entorno JRE. La aplicación utiliza algunos archivos jar externos y los hemos incluido en la carpeta JAVA_HOME/lib/ext. Esto nos ha funcionado por años, pero recientemente un nuevo programador se unió a nuestro equipo y parece enfático en que esta es una de las cosas malas que hay que hacer. No puedo entender por qué y estoy tratando de investigar un poco antes de seguir profundizando con este desarrollador. ¿Hay algo que me falta aquí?¿Es malo poner tarros externos en el directorio JAVA_HOME/lib/ext?
Respuesta
Sí - es una mala cosa. Piénselo: la aplicación depende del JRE y algunos frascos adicionales. ¿Qué pasa si actualiza el JRE? Luego debe recordar copiar los archivos en el nuevo JRE. ¿Qué sucede si necesita configurar la aplicación en un sistema nuevo? Tienes que copiar la aplicación allí, y luego también recuerdas copiar los archivos jar externos en el JRE en ese sistema.
Ambos problemas no serían un problema en absoluto si solo empaqueta la aplicación correctamente junto con los contenedores externos que necesita. Si no ves esto, entonces tal vez no sea un problema en absoluto. Pero aún deberías estar agradecido por el chico nuevo por compartir su opinión.
Depende mucho de su uso personal/de la compañía. Para mí, es normal examinar el directorio ext después de una actualización para mover las bibliotecas de uso frecuente de aquí para allá, por ejemplo, itext (pdf-creation), o una tabla-biblioteca. Si hay un conflicto de versión, le gusta saberlo temprano y debe saberlo en ambos casos.Pero las actualizaciones menores en las bibliotecas para las correcciones de errores son más fáciles de manejar si las hace en un lugar y no en varios lugares. Si hay un programa que no puede manejar una biblioteca fija de este tipo, debe arreglarlo de todos modos. –
Totalmente de acuerdo, pero ahora el problema es qué hacer si muchas de mis aplicaciones dependen de la misma biblioteca/jar. No quiero poner una copia del archivo jar en cada uno, porque si la biblioteca se actualiza, tendría que cambiar el contenedor para todas mis aplicaciones. Quiero poner este contenedor en un lugar donde todas mis aplicaciones puedan acceder a él. ¿Existe tal lugar? ¿O necesito usar classpath (hay un problema si decido mover el jar, necesito cambiar el classpath para todas mis aplicaciones ...)? – Benitok
Además de la respuesta de weiji (empaque y actualizaciones de las nuevas versiones de JVM), existen otros riesgos.
Si está utilizando el administrador de seguridad en cualquiera de sus aplicaciones, las bibliotecas en ext a menudo tienen mucha más capacidad de forma predeterminada: se tratan de manera similar a las bibliotecas del sistema. Debe asegurarse de que puede confiar, en el sentido de hacer cumplir las reglas de seguridad, estas clases. ¿Los autores pensaron a través de lo que estaban exponiendo correctamente? Si estas clases no usan control de acceso para cambiar el contexto de seguridad, entonces no necesita preocuparse por esto, pero ¿sabe si lo hacen o no? (Por ejemplo, un método que proporciona acceso a un archivo y usa AccessController, ¿se asegura? que la persona que llama tiene los permisos de archivo correctos?)
¿Pueden todas sus aplicaciones usar la misma versión exacta de la biblioteca? ¿Qué sucede cuando necesita actualizar esa biblioteca (no solo la JVM)? ¿Romperás alguna de tus aplicaciones? Deberás volver a probar todo. Las bibliotecas en ext son cargadas por el cargador de clases de extensión que, debido a la delegación principal, tiene mayor precedencia que el cargador normal (es decir, CLASSPATH) por lo que su aplicación garantiza su uso y no hay forma de que una aplicación individual para anular la biblioteca en ext con una versión diferente.
Si desea compartir las bibliotecas en sus aplicaciones, ¿por qué no proporcionar una carpeta separada de bibliotecas comunes que las aplicaciones pueden configurarse individualmente (CLASSPATH) como referencia? Luego, si tiene problemas con una aplicación y una biblioteca, puede cambiar a una versión diferente de las bibliotecas o solo para esa, colocarla antes en CLASSPATH (si eso funciona, debe probar esto también, ya que puede haber otra dependencia). cuestiones). Esto le permitirá tener más control individual para cada aplicación. Pero entonces, agrupar todas las bibliotecas requeridas con su aplicación es lo más seguro ya que puede volver a probar e implementar actualizaciones de biblioteca para aplicaciones individuales.
También parece que JEP-220 está aparentemente desaprobando este comportamiento con algunos medios arbitrarios para "posiblemente reemplazarlo" con algún otro comportamiento.
- ¡sin contener la respiración! - –
En realidad, los aspectos de Java SE para el mecanismo de extensión fueron desaprobados en una versión de mantenimiento de JSR 337 (el JSR para Java SE 8) y luego eliminados en Java SE 9/JDK 9. La línea de comandos '-XX: + CheckEndorsedAndExtDirs' la opción es una opción útil para verificar si las aplicaciones que se ejecutan en JDK 8 dependen de esta característica. –
- 1. actualización de Android 17 parece incompatible con tarros externos
- 2. ¿Es una mala práctica poner usuarios externos en Active Directory?
- 3. ¿Qué tan malo es poner javascript fuera del encabezado?
- 4. ¿Por qué Spring AOP no está tejiendo tarros externos en tiempo de ejecución?
- 5. ¿Qué tan malo es poner un CSS incluido en el medio del cuerpo?
- 6. ¿El lazo cerrado es malo?
- 7. Dónde poner archivos de texto en el directorio de Android
- 8. log4j.xml en tarros de cliente
- 9. django: ¿cómo poner un archivo estático en el directorio raíz?
- 10. ¿Es malo poner una consulta MySQL en un bucle de PHP?
- 11. ¿Manera limpia de combinar varios tarros? Preferiblemente usando Ant
- 12. ¿Es malo usar toList?
- 13. ¿Por qué es malo?
- 14. ¿El uso excesivo de DataTable es malo?
- 15. ¿Por qué el bloqueo (esto) {...} es malo?
- 16. Cómo usar hiedra para construir una guerra sin copiar tarros en un directorio lib
- 17. ¿Dónde colocar los frascos externos?
- 18. cómo agregar archivos a los tarros META-INF
- 19. ¿Por qué es malo poner un espacio antes de un punto y coma?
- 20. Al usar Sesiones es malo, y ¿qué tiene de malo?
- 21. Classloader de sistema de reemplazo para clases en tarros que contienen tarros
- 22. cuando las clases en tarros entran en PermGen
- 23. msdeploy --- ¿funciona o es malo?
- 24. ¿Es malo hacer tareas internas?
- 25. ¿Es malo usar relaciones redundantes?
- 26. ¿Es malo sincronizar NSUserDefaults en - (void) dealloc?
- 27. ¿Por qué es "import *" malo?
- 28. ¿Por qué es JFormattedTextField malo?
- 29. IntelliJ no importa los tarros
- 30. Incluir encabezados externos en Eclipse para C
Dale un aumento, o al menos un bono. No en tus manos, habla con los gerentes. Seriamente. –