2010-05-08 14 views
5

¿Cómo se determina qué jarras se necesitan para tal o cual característica de una estructura? Por ejemplo, ¿qué frascos se necesitarían de todos los disponibles para Spring para admitir solo la inyección de dependencia?Determinar qué jarrones mínimos se necesitan para una función

+3

Prueba, prueba, prueba. Pero generalmente si el marco dice que necesita todos los frascos, es mejor que proporciones todos los frascos, de lo contrario estarás solo. –

+1

Un ejemplo es Spring. Casi todas las dependencias de terceros están marcadas como opcionales en Maven POM. Estoy de acuerdo en que la prueba es la "solución general" para esto, pero es una buena pregunta. A menudo he deseado una forma de saber en tiempo de ejecución qué bibliotecas se usan realmente. He utilizado Java Ahead-of-Time Native Compiler - esto registró todas las clases utilizadas y los jarros de los que provienen. Podría emular algo similar con un cargador de clases personalizado que rastree las clases cargadas y use Class.getResource() para determinar la ubicación. – mdma

Respuesta

4

Hay herramientas que crean JAR mínimos al descubrir qué clases se usan realmente en una aplicación al analizar estáticamente el código, y luego crear un nuevo JAR que contiene solo esas clases. (. Recuerdo usando Zelix ClassMaster para hacer esto, pero hay muchas alternativas)

El problema con el uso de estas herramientas para un marco DI como la primavera incluyen:

  • el único rastro dependencias estáticas existentes. Si cargas clases dinámicamente, tienes que decirle específicamente al analizador acerca de cada una. Los marcos DI en general, y Spring en particular, están repletos de carga dinámica, incluida la carga dinámica que es opaca al código de la aplicación.

  • Las herramientas existentes funcionan creando un nuevo JAR de salida, no indicándole cuáles de los JAR de entrada no se utilizan. Si bien el reempaquetado de los archivos JAR está bien si está creando una aplicación empaquetada desde una base de código cerrado, no es deseable en general, y puede ser problemático con algunas licencias de código abierto. Ciertamente no quieres hacer esto con Spring.

En teoría, alguien podría escribir una herramienta para ayudar. En la práctica, la herramienta necesitaría (por ejemplo) saber cómo extraer dependencias de clase dinámicas de las configuraciones de Spring expresadas en anotaciones, XML y descripciones de bean creadas en tiempo de ejecución desde una configuración de orden superior (SpringSecurity hace esto, por ejemplo). Esa es una gran pregunta. Y aun así, usted tiene el problema de que un cambio "pequeño" en los cables hechos en la plataforma de instalación podría fallar debido a que los JAR requeridos han quedado fuera por el proceso de poda JAR.

En mi opinión, las alternativas más prácticas son:

  • Si utiliza Maven/Ivy para administrar sus dependencias, mirar los gráficos de dependencia, tira a dependencias que parecen ser ya no es necesario ... y prueba, prueba, prueba.
  • Elimine manualmente los JAR que parecen no utilizados ... y pruebe, pruebe y pruebe.
  • No te preocupes por eso. Un nivel moderado de fragmentos JAR no utilizados podría agregar un segundo o tres a los tiempos de inicio de despliegue y aplicación de aplicaciones, pero eso generalmente no importa. (Pero si lo hace ... vea más arriba.)
+1

[Proguard] (http://proguard.sourceforge.net) es otro ejemplo que puede hacer eso (y más). – BalusC

+0

@BalusC - y hay indudablemente otros ejemplos valiosos. Pero desafortunadamente, realmente no abordan * este * problema. –

+0

Me estaba refiriendo al primer párrafo :) Antes de editar las alternativas prácticas, que sin embargo estoy totalmente de acuerdo (+1). – BalusC

1

Es por eso que algunos proyectos anteriores de Java terminan teniendo 600 Jars y un archivo war de 200 MB, para una aplicación de 10.000 líneas. Un poco doloroso si no lo maneja con cuidado ...

0

Realmente debe consultar al proveedor de la infraestructura o leer la documentación. El análisis estadístico de los frascos necesarios puede no ser suficiente en algunos casos (carga dinámica) y, a veces, puede terminar con demasiados frascos.

Una vez hice algunas cosas de ayuda de ftp a una especie de biblioteca de "utilidad". Depende de algún jar apache ftp. Si nunca usó las características de ftp en la biblioteca, no necesitaría el frasco ftp, pero el análisis estadístico del código podría indicar que lo necesita. Esto es algo que debes documentar.

Cuestiones relacionadas