2012-03-29 69 views
5

Tôi đang cố gắng lấy thời gian biên dịch của tệp JAR chạy được mà tôi đang xuất từ ​​Eclipse. Một cách để làm điều này có lẽ là để có được thời gian sửa đổi của tập tin META-INF/MANIFEST.MF. Thật không may tôi dường như không thể tìm cách để có được thông tin này (tôi biết cách đọc bản kê khai bằng cách sử dụng getResourceAsStream("/META-INF/MANIFEST.MF"), nhưng dường như tôi không thể đọc được thời gian sửa đổi của nó).Nhận thời gian biên dịch JAR

Có ai đó một số thông tin chi tiết về cách thực hiện không?

Trả lời

3

Cuối cùng, dựa trên câu trả lời Aleks G và những người khác tìm thấy ở những nơi khác, tôi đã đưa ra một giải pháp mạnh mẽ hơn (ví dụ đó cũng hoạt động trên mạng chia sẻ):

public static Long getTime(Class<?> cl) { 
    try { 
     String rn = cl.getName().replace('.', '/') + ".class"; 
     JarURLConnection j = (JarURLConnection) ClassLoader.getSystemResource(rn).openConnection(); 
     return j.getJarFile().getEntry("META-INF/MANIFEST.MF").getTime(); 
    } catch (Exception e) { 
     return null; 
    } 
} 

Tôi đã hy vọng cho một cách tốt hơn để đi từ đối tượng Class sang tên tài nguyên nhưng tôi đoán điều này sẽ phải làm.

7

Nếu bạn có quyền truy cập vào tệp jar, bạn có thể đọc tệp jar bằng cách sử dụng gói java.util.jar, sau đó nhận ZipEntry cho tệp kê khai và sử dụng getTime() để nhận thời gian cập nhật cuối cùng.

JarFile jf = new JarFile("myfile.jar"); 
ZipEntry manifest = jf.getEntry("META-INF/MANIFEST.MF"); 
long manifestTime = manifest.getTime(); //in standard millis 

Nếu bạn cần xử lý lớp cụ thể, bạn có thể thấy mã này cũng hữu ích;

String rn = this.getClass().getName().replace('.', '/') + ".class"; 
String path = getClass().getClassLoader().getResource(rn).getPath(); 
String jarFile = path.substring(0, path.indexOf("!")); 

Sau đó jarFile sẽ chứa tên đường dẫn của bình của bạn. Lưu ý rằng nếu lớp không được nạp từ tệp jar, thì dòng thứ ba sẽ không thành công, vì path.indexOf sẽ trả về -1.

+0

Chắc chắn, nhưng điều này sẽ phá vỡ khủng khiếp nếu bình được đổi tên. Tôi có thể nhận được một tham chiếu đến JarFile thực tế lớp chính của tôi đang được nạp từ? – CAFxX

+0

Có, bạn sẽ có thể nhận được điều đó thông qua đối tượng trình nạp lớp. –

+0

@CAFxX Tôi đã cập nhật câu trả lời của mình để hiển thị cách lấy tên của tệp jar có lớp. –

Các vấn đề liên quan