Tôi nghĩ rằng nó sẽ không quá khó để viết một công cụ để tự của bạn.
Bạn có thể nhận các mục nhập classpath bằng System.getProperty ("java.class.path");
Và sau đó đi bộ qua các lọ, khóa hoặc các thư mục được liệt kê ở đó và thu thập tất cả thông tin về các lớp và tìm ra những thông tin có thể gây ra sự cố.
Nhiệm vụ này sẽ mất tối đa 1 hoặc 2 ngày. Sau đó, bạn có thể tải lớp này trực tiếp trong ứng dụng của mình và tạo báo cáo.
Có lẽ thuộc tính java.class.path sẽ không hiển thị tất cả các lớp nếu bạn chạy trong một số cơ sở hạ tầng với tải lớp tùy chỉnh phức tạp (ví dụ: tôi đã từng thấy ứng dụng tải các lớp từ LDAP) nhưng nó chắc chắn sẽ hoạt động tốt nhất của các trường hợp.
Là một công cụ bạn có thể thấy hữu ích, tôi chưa bao giờ sử dụng nó, nhưng hãy thử và cho chúng tôi biết kết quả.
http://www.jgoodies.com/freeware/jpathreport/features.html
Nếu bạn đang đi để tạo ra công cụ của riêng bạn, đây là đoạn code tôi sử dụng cho các kịch bản shell cùng gửi trước đó, nhưng mà tôi sử dụng trên máy tính Windows của tôi. Nó chạy nhanh hơn khi có tấn tệp jar.
Bạn có thể sử dụng và sửa đổi nó để thay vì đệ quy đi bộ thư mục, đọc đường dẫn lớp và so sánh thuộc tính thời gian .class.
Có một lớp học chỉ huy bạn có thể phân lớp nếu cần thiết, tôi đã suy nghĩ trong tùy chọn -execute của "tìm"
này mã của riêng tôi, vì vậy nó đã không có ý định "sản xuất sẵn sàng", chỉ để làm việc.
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){}
}
}
}
Tôi hy vọng điều này sẽ hữu ích.
Hãy thử jarfish cũng (câu trả lời khác của tôi); Tôi đã sử dụng thành công –
Yup! Hoặc điều này hoặc http://stackoverflow.com/questions/135971/is-there-a-tool-to-discover-if-the-same-class-exists-in-multiple-jars-in-the-clas/4516827 # 4516827 nên làm các trick! –
Có công cụ/cách nào chỉ lọc các lớp được sử dụng (đã nhập) không? Chúng tôi có rất nhiều lớp học trùng lặp trong classpath của chúng tôi mà thực sự không bao giờ được sử dụng –