2009-05-18 29 views
21

¿Alguien tiene código para detectar JAR duplicados en el classpath?¿Cómo detectar duplicados JAR en el classpath?

Antecedentes: cuando hay dos versiones del mismo JAR en el classpath, pueden ocurrir cosas realmente extrañas. Esto puede suceder incluso cuando se usan herramientas como Maven: cambiar una dependencia y construir WAR sin limpiar primero. Como no se limpió el target/webapp/WEB-INF/lib, la dependencia estará allí dos veces.

¿Hay una red de seguridad para esto?

+1

Verificar si esto puede ayudarlo: http: // stackoverflow.com/questions/17555928/remove-duplicate-jars-in-a-directroy/20611435 # 20611435 –

Respuesta

22

JBoss Tattletale podría ayudarlo con esto.

Es una herramienta gratuita que escanea los archivos JAR utilizados por su proyecto y le brinda un informe sobre ellos.

Entre su característica son:

  • Puntual si una clase se encuentra en varios archivos JAR
  • Puntual si el mismo archivo JAR se encuentra en varios lugares
  • Encuentra archivos JAR similares que tienen versión diferente números
1

Creo que el forma más simple es simplemente trash el directorio de destino primero. Esperemos que copiar todos los archivos .jar no vaya a consumir mucho tiempo.

De lo contrario, tendrá que comparar de algún modo archivos considerables (ya sea directamente, mediante suma de comprobación calculada o similar). Lo cual no suena muy bien en absoluto.

-2

Puede escribir un script simple para comparar la suma md5 de cada archivo jar con cada otro archivo jar y eliminar los duplicados en el camino.

+2

dos versiones significa por definición que la suma md5 no coincidirá :-) –

+0

perdón, perdí la parte de la versión diferente de tu pregunta – neesh

2

System.getProperty("java.class.path"), divídalo, ordénelo, mírelo con el ojo humano :-).

No incluirá la ruta de clase derivada de los manifiestos dentro de otros thou :-(frascos

O utilice http://www.jboss.org/tattletale como uno de los carteles sugirió

+0

Esto supone que tus engañados tienen el mismo nombre. A menudo, el problema son las clases duplicadas en frascos con diferentes nombres. Necesitarías más de un par de globos oculares allí. – sal

+0

Normalmente, los nombres serán diferentes solo en una versión en algún lugar (generalmente un sufijo). Programáticamente podría detectar y resaltar prefijos comunes. –

+0

Solo necesita algún tipo de señal de advertencia en ciertos casos. Lo que propuse se puede codificar en 2 minutos y ejecutar como una especie de prueba de humo para detectar duplicados "normales/fáciles" al inicio de la aplicación. Si desea un análisis exhaustivo, use una herramienta como el chiste propuesto :-). –

4

hay un plugin de Maven para hacer precisamente eso:.. maven-duplicate-finder-plugin

[EDIT] Si desea hacerlo en la unidad de pruebas a ti mismo, utilice

getClass().getClassLoader().getResources("com/pany/package/Java.class") 

Si esto devuelve más de un URL, tiene duplicados en el classpath.

El inconveniente es que esto solo funciona para los casos en los que tuvo conflictos en el pasado. En el lado positivo, son solo unas pocas líneas de código (o una línea cuando escribes un método de ayuda) y funciona en tu servidor de compilación.

Cuestiones relacionadas