2010-03-03 28 views
5

Trong ứng dụng của chúng tôi thông qua quá trình phát triển nhiều tệp JAR đã được thu thập. Làm thế nào tôi có thể lọc ra những cái mà không được ứng dụng sử dụng nữa? Trên một số cách dễ dàng?Làm cách nào để tìm hiểu ứng dụng JAR nào không sử dụng?

+0

Câu hỏi hay. Tôi cũng muốn biết điều này :) – Alfred

+0

Tôi nghĩ rằng đây là một trong những lỗ hổng lớn nhất của java, thực tế là các phụ thuộc động không thể đinh xuống 100% – karoberts

Trả lời

3

Nếu bạn chắc chắn bạn có thể thực hiện ứng dụng của mình để nó sử dụng tất cả các lọ, bạn có thể tạo một đơn giản kịch bản perl:

while (<>) { 
    $l{$1}++ if m/\s+from\s+(.+\.jar)/; 
} 

for $l (keys(%l)) { 
    print "$l\n"; 
} 

(cho phép đặt tên là list_jars.pl) và thức ăn nó đầu ra của một hoạt động chi tiết:

java -verbose -jar YOUR_APP.jar | perl list_jars.pl 

mà nên liệt kê tất cả các nguồn của các tầng lớp nạp.

+0

bây giờ là một mẹo thực sự gọn gàng – radai

+0

Nếu tôi có lưu trữ ứng dụng web (chiến tranh) thì sao? – Trick

+0

Kịch bản perl phân tích cú pháp đầu ra của trình nạp lớp tiết ra, đối với một ứng dụng web, bạn có thể thêm -verbose vào các tham số khởi động và phân tích cú pháp kết quả đầu ra tiêu chuẩn kết quả. (Điều này có thể sẽ hiển thị lọ được sử dụng bởi các thùng chứa servlet quá.) – rsp

0

Viết tập lệnh xóa từng tập lệnh một khỏi đường dẫn xây dựng của bạn, biên soạn dự án và kiểm tra lỗi xây dựng. Kịch bản sẽ lắp ráp một danh sách các lọ không sử dụng. Nên dễ viết trong bash/python.

Giải pháp này không thể theo dõi phụ thuộc thời gian chạy dựa trên phản ánh (xem nhận xét của tôi bên dưới).

+2

Điều đó sẽ tìm ra các lỗi biên dịch thời gian, nhưng không phải là lỗi dẫn đến thời gian chạy thất bại của tải lớp bị trì hoãn. Đặc biệt với các khuôn khổ phức tạp, những thứ như vậy khá phổ biến. Thậm chí tệ hơn là khi khung công tác chọn một lớp có sẵn cho một giao diện cụ thể và hành vi này khác nhau tùy thuộc vào việc triển khai thực sự được sử dụng. Tôi khuyên bạn nên chạy thử nghiệm tích hợp đầy đủ sau khi bạn nghĩ mình đã hoàn tất. –

+0

Bạn nói đúng, giải pháp này không xử lý trường hợp đó. Nhưng tôi nghĩ rằng nó là khá không thể làm điều đó tự động nếu bạn sử dụng một số phản ánh tiên tiến. Bạn sẽ làm gì, trích xuất tất cả các chuỗi trong mã có thể khớp với tên lớp:>? – pajton

+0

Bạn cũng có thể thực hiện điều này thông qua IDE Eclipse bằng cách loại bỏ các mục từ một .classpath cùng một lúc và xây dựng lại dự án. Khi công cụ chuyển sang màu đỏ, bạn đã xóa một thứ đang được sử dụng. ;-) –

1

nếu bạn đang sử dụng maven, có một mojo cho rằng: mvn dependency: phân tích nếu không, tôi không biết bất kỳ cách nào dễ dàng. cách cứng sẽ liên quan đến phân tích bytecode của tất cả các lớp được biên dịch của dự án của bạn để kiểm tra nhập khẩu ...

+0

và suy nghĩ về nó, ngay cả khi không phản chiếu ... – radai

+0

Không ... Nhưng maven sẽ bắt phụ thuộc khai báo trong tệp pom.xml nhưng không rõ ràng trong mã (khung và trình điều khiển nạp động chẳng hạn.) –

0

Có lẽ bạn có thể viết ClassLoader của riêng bạn, kế thừa từ java.lang.ClassLoader, ghi nhật ký của các lớp được nạp? Điều đó vẫn không giải quyết được vấn đề bảo đảm đầy đủ tất cả các lớp được tải trong tất cả các đường dẫn mã có thể, mặc dù

1

Tôi đã sử dụng stan. đó là một bộ phân tích cấu trúc cho java, và nó cho tôi kết quả rất tốt.

Bạn có thể trực quan xem lọ nào được sử dụng và loại bình nào không được sử dụng.

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