creo que no sería demasiado difícil escribir una herramienta para su auto.
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 clases personalizadas (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ébenos el resultado.
http://www.jgoodies.com/freeware/jpathreport/features.html
Si va a crear su propia herramienta, aquí está el código que utilizo para la misma secuencia de comandos shell publicado antes, pero que yo 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 comandos que puede subclase si es necesario, estaba pensando en la opción -execute de "encontrar"
Esta mi propio código, por lo que no estaba destinado a ser "listos para la producción", sólo para Haz 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.
Pruebe también con jarfish (mi otra respuesta); Lo utilicé con éxito –
¡Sí! O esto o http://stackoverflow.com/questions/135971/is-there-a-tool-to-discover-if-the-same-class-exists-in-multiple-jars-in-the-clas/4516827 # 4516827 debería hacer el truco! –
¿Hay alguna herramienta/forma que filtre solo las clases usadas (importadas)? Tenemos muchas clases duplicadas en nuestro classpath que en realidad nunca se usan –