script configurar java jar classpath

java - configurar - ¿Hay alguna herramienta para descubrir si existe la misma clase en varios archivos jar en el classpath?



configurar classpath java (7)

Creo que no sería muy difícil escribir una herramienta para ti.

Puede obtener las entradas classpath con System.getProperty ("java.class.path");

Y luego camine por los frascos, cremalleras o directorios allí enumerados y recopile toda la información sobre las clases y descubra las que podrían causar problemas.

Esta tarea tomaría 1 o 2 días como máximo. Luego puede cargar esta clase directamente en su aplicación y generar un informe.

Probablemente, la propiedad java.class.path no mostrará todas las clases si ejecuta en alguna infraestructura con carga compleja de clase personalizada (por ejemplo, una vez vi una aplicación que carga las clases desde el LDAP) pero ciertamente funcionaría para la mayoría de los casos.

Aquí hay una herramienta que puede serle útil, nunca la he usado, pero pruébela y cuéntenos el resultado.

http://www.jgoodies.com/freeware/jpathreport/features.html

Si va a crear su propia herramienta, aquí está el código que uso para el mismo script de shell publicado anteriormente, pero que uso en mi máquina de Windows. Funciona más rápido cuando hay toneladas de archivos jar.

Puede usarlo y modificarlo para que en lugar de caminar recursivamente por un directorio, lea la ruta de la clase y compare el atributo de tiempo de clase.

Hay una clase de comando en la que puedes crear una subclase si es necesario, estaba pensando en la opción -execute de "buscar"

Este es mi propio código, por lo que no estaba destinado a estar "listo para producción", solo para hacer el trabajo.

import java.io.*; import java.util.zip.*; public class ListZipContent{ public static void main( String [] args ) throws IOException { System.out.println( "start " + new java.util.Date() ); String pattern = args.length == 1 ? args[0] : "OracleDriver.class";// Guess which class I was looking for :) File file = new File("."); FileFilter fileFilter = new FileFilter(){ public boolean accept( File file ){ return file.isDirectory() || file.getName().endsWith( "jar" ); } }; Command command = new Command( pattern ); executeRecursively( command, file, fileFilter ); System.out.println( "finish " + new java.util.Date() ); } private static void executeRecursively( Command command, File dir , FileFilter filter ) throws IOException { if( !dir.isDirectory() ){ System.out.println( "not a directory " + dir ); return; } for( File file : dir.listFiles( filter ) ){ if( file.isDirectory()){ executeRecursively( command,file , filter ); }else{ command.executeOn( file ); } } } } class Command { private String pattern; public Command( String pattern ){ this.pattern = pattern; } public void executeOn( File file ) throws IOException { if( pattern == null ) { System.out.println( "Pattern is null "); return; } String fileName = file.getName(); boolean jarNameAlreadyPrinted = false; ZipInputStream zis = null; try{ zis = new ZipInputStream( new FileInputStream( file ) ); ZipEntry ze; while(( ze = zis.getNextEntry() ) != null ) { if( ze.getName().endsWith( pattern )){ if( !jarNameAlreadyPrinted ){ System.out.println("Contents of: " + file.getCanonicalPath() ); jarNameAlreadyPrinted = true; } System.out.println( " " + ze.getName() ); } zis.closeEntry(); } }finally{ if( zis != null ) try { zis.close(); }catch( Throwable t ){} } } }

Espero que esto ayude.

Si tiene dos jar en su classpath que contienen diferentes versiones de la misma clase, el orden de la ruta de clases se vuelve crítico.

Estoy buscando una herramienta que pueda detectar y marcar dichos conflictos potenciales en una ruta de clase determinada o conjunto de carpetas.

Sin duda, un script que comienza:

classes=`mktemp` for i in `find . -name "*.jar"` do echo "File: $i" > $classes jar tf $i > $classes ... done

con algún tipo inteligente / uniq / diff / grep / awk más adelante tiene potencial, pero me preguntaba si alguien sabe de alguna solución existente.





Parece que Jarfish hará lo que quieras con su comando "dupes".


La herramienta Tattletale de JBoss es otro candidato: "Detectar si una clase / paquete está ubicado en varios archivos JAR"


Si no le gusta descargar e instalar cosas, puede usar este comando de una línea para encontrar conflictos de jar con las herramientas gnu estándar. Es rudimentario, pero puedes ampliarlo como desees.

ls *.jar | xargs -n1 -iFILE unzip -l FILE | grep class | sed "s,.* ,," | tr "/" "." | sort | uniq -d | xargs -n1 -iCLASS grep -l CLASS *.jar | sort -u

(Es un poco lento para correr si tienes muchos frascos)

Explicación: Lista todos los archivos en todos los archivos jar, greps para clase, encuentra duplicados y luego greps los archivos originales para ver dónde aparecieron. Podría hacerse más eficiente con un script más complicado.