denke ich, es nicht zu hart wäre, ein Werkzeug für die Sie sich selbst zu schreiben.
Sie können die Klassenpfadeinträge mit System.getProperty ("java.class.path") abrufen;
Und dann gehen Sie durch die Gläser, Reißverschlüsse oder Verzeichnisse aufgelistet und sammeln Sie alle Informationen über die Klassen und finden Sie diejenigen, die Probleme verursachen könnten.
Diese Aufgabe dauert höchstens 1 oder 2 Tage. Dann können Sie diese Klasse direkt in Ihre Anwendung laden und einen Bericht generieren.
Wahrscheinlich werden die Klassen java.class.path nicht alle Klassen anzeigen, wenn Sie in einer Infrastruktur mit komplexen benutzerdefinierten Klassen laden (zum Beispiel habe ich einmal eine App gesehen, die die Klassen aus dem LDAP laden), aber es würde sicherlich für die meisten funktionieren der Fälle.
Heres ein Werkzeug, das Sie nützlich finden könnten, ich habe es nie selbst benutzt, aber versuchen Sie es und lassen Sie uns das Ergebnis wissen.
http://www.jgoodies.com/freeware/jpathreport/features.html
Wenn Sie Ihr eigenes Werkzeug gehen zu schaffen, hier ist der Code, den ich für den gleichen Shell-Skript vor geschrieben verwenden, aber, dass ich auf meinem Windows-Rechner verwenden. Es läuft schneller, wenn es viele JAR-Dateien gibt.
Sie können es verwenden und ändern, anstatt ein Verzeichnis rekursiv zu durchlaufen, den Klassenpfad zu lesen und das Zeitattribut .class zu vergleichen.
Es gibt eine Befehlsklasse Sie können bei Bedarf eine Unterklasse, war ich in der -execute Option „finden“
Dieser meinen eigenen Code zu denken, so war es nicht „Produktion bereit“ soll, nur um mach die Arbeit.
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){}
}
}
}
Ich hoffe, das hilft.
Versuchen Sie Jarfish auch (meine andere Antwort); Ich benutzte es erfolgreich –
Yup! Entweder dies oder http://stackoverflow.com/questions/135971/is-there-a-tool-to-discover-if-the-same-class-exists-in-multiple-jars-in-the-clas/4516827 # 4516827 sollte den Trick machen! –
Gibt es ein Tool/einen Weg, der nur verwendete (importierte) Klassen filtert? Wir haben viele Klassen in unserem Klassenpfad, die eigentlich nie benutzt werden –