2011-11-10 11 views
6

Tengo un proyecto con un millón de jarras (bueno, mucho). Vinieron a mí por maven, y solo uso un pequeño conjunto de funcionalidades. Por pura limpieza, me preguntaba con jarras de las que podría prescindir.¿Determinar tarros no utilizados por cobertura de código?

Mi primer pensamiento fue ejecutar el programa con una herramienta de cobertura de código, y luego encontrar las clases que se tocaron.

¿Alguien ha hecho esto antes? ¿O hay trucos más inteligentes para lograr lo mismo?

+0

eliminar los archivos jar de la ruta de clases uno por uno volver a agregar el último en e eliminado cuando la compilación se rompe –

+2

@ratchet freak - Mala idea, no detectará dependencias de tiempo de ejecución indirectas a menos que la compilación incluya pruebas de integración completa. –

+0

@ratchet freak - Eso podría funcionar, pero ese es mi último recurso de fuerza bruta. – RobAu

Respuesta

4

Puede ejecutar el proyecto utilizando la opción de VM -verbose:class. Esto se imprimirá para todas las clases cargadas desde donde se cargan. El uso de una aplicación de análisis inteligente/grep/regexp le permitirá filtrar los nombres de los jar en un conjunto de entradas únicas e indicarle cuáles se utilizan.

Creo que esto sería más fácil porque automáticamente te dirá si se usa una clase y, en caso afirmativo, en qué jar.

Por supuesto, el problema con esto y la cobertura del código es que será posible que elimine un jar que solo se usa en algunos casos excepcionales, pero su compilador se quejará si eliminó uno o dos demasiados, dejándolo con el (en su mayoría no demasiado complicado) tarea de encontrar la que tarro de la clase está en

Posible sugerencia al utilizar Linux:.

java -verbose:class <your startup command here> | grep "\[Loaded" | grep -o "from .*\]" | cut -c 6- | sort | uniq

Si no está utilizando Linux, a continuación, guardar en un archivo, obtener una máquina Linux y ejecutar en Linux (o usar algo para ejecutar comandos bash en Windows)

+0

Gracias, esta es probablemente la forma más fácil de hacerlo. Me pregunto, como es probable que más gente tenga esta pregunta, si alguien ya tiene algún código para hacer esto ... Es un buen ejercicio, pero ¿por qué reinventar la rueda? – RobAu

+1

@RobAu Se agregó un ejemplo para Linux. No es ideal, pero sí el truco. – Thirler

0

Considere utilizar una herramienta que ya existe, como Dependency Finder o .

Al igual que con todas las herramientas de análisis estático, el uso de marcos de reflexión o DI puede arrojar esto; He recurrido a herramientas personalizadas que usan esta y otras entradas para resolver las cosas, aunque todavía es estático.

Para obtener información completa sobre el uso del tiempo de ejecución, puede usar la solución de Thirler, aunque si está completa o no puede depender de qué rutas de código se sigan.

0

Puede usar Maven Dependency Plugin para analizar su árbol de dependencias. También le sugerirá las dependencias que se descargan/agregan a su proyecto porque dependen de otros archivos.

Ejecute un mvn dependency:tree y vea si está utilizando algunos frascos no requeridos.

+0

Eso no funcionará, ya que necesito el comportamiento dinámico, no un análisis estático. – RobAu

Cuestiones relacionadas