tutorial refid que comando basedir java jar classpath

java - refid - ¿Cómo detectar JARs duplicados en el classpath?



comando ant windows (5)

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

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

¿Hay una red de seguridad para esto?


Creo que la forma más sencilla es simplemente destruir el directorio de destino primero. Es de esperar que copiar todos los archivos .jar no lleve mucho tiempo.

De lo contrario, tendrá que comparar de alguna manera los archivos considerables (ya sea directamente, a través de una suma de comprobación computada o similar). Lo que no suena muy bien en absoluto.


Hay un complemento de Maven para hacer precisamente eso: maven-duplicate-finder-plugin

[EDITAR] Si quiere hacerlo usted mismo en pruebas unitarias, use

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

Si esto devuelve más de una URL , tiene duplicados en la ruta de clase.

El inconveniente es que esto solo funciona en 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 auxiliar) y funciona en tu servidor de compilación.


Puede escribir un script simple para comparar la suma md5 de cada archivo jar con cada otro archivo jar y eliminar duplicados a lo largo del camino.


JBoss Tattletale podría ayudarte con esto.

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

Entre sus características destacan:

  • Spot si una clase se encuentra en varios archivos JAR
  • Detecta si el mismo archivo JAR se encuentra en varias ubicaciones
  • Encuentra archivos JAR similares que tienen diferentes números de versión

System.getProperty("java.class.path") , System.getProperty("java.class.path") , System.getProperty("java.class.path") , mírelo con el ojo humano :-).

No incluirá la ruta de clase derivada de manifiestos dentro de otros frascos que :-(.

O use http://www.jboss.org/tattletale como uno de los carteles sugeridos.