Je pense qu'il ne serait pas trop difficile d'écrire un outil pour soi-même.
Vous pouvez obtenir les entrées du chemin de classe avec System.getProperty("java.class.path") ;
Ensuite, parcourez les jarres, les zips ou les répertoires qui y sont répertoriés et recueillez toutes les informations sur les classes et repérez celles qui pourraient poser problème.
Cette tâche prendrait 1 ou 2 jours au maximum. Vous pouvez ensuite charger cette classe directement dans votre application et générer un rapport.
Il est probable que la propriété java.class.path n'affichera pas toutes les classes si vous utilisez une infrastructure avec un chargement de classe personnalisé complexe ( par exemple, j'ai vu une fois une application qui chargeait les classes à partir du LDAP ), mais cela fonctionnerait certainement dans la plupart des cas.
Voici un outil qui pourrait vous être utile, je ne l'ai jamais utilisé moi-même, mais essayez-le et faites-nous part du résultat.
http://www.jgoodies.com/freeware/jpathreport/features.html
Si vous souhaitez créer votre propre outil, voici le code que j'utilise pour le même script shell que celui posté précédemment, mais que j'utilise sur ma machine Windows. Il fonctionne plus rapidement lorsqu'il y a des tonnes de fichiers jar.
Vous pouvez l'utiliser et le modifier pour qu'au lieu de parcourir récursivement un répertoire, vous lisiez le chemin de la classe et compariez l'attribut temporel .class.
Il existe une classe Command que vous pouvez sous-classer si nécessaire, je pensais à l'option -execute de "find"
Il s'agit de mon propre code, qui n'est donc pas destiné à être "prêt pour la production", mais simplement à faire le travail.
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 ){}
}
}
}
J'espère que cela vous aidera.