2010-09-28 14 views
11

một ứng dụng tôi đã viết sử dụng một số lọ bên thứ ba. Đôi khi chỉ một phần nhỏ của toàn bộ 50kB đến 1,7mB jar được sử dụng - một hoặc hai cuộc gọi hoặc các lớp chức năng.Giảm thiểu kích thước phụ thuộc của jar

Cách tốt nhất để giảm kích thước bình. Tôi có nên tải xuống các nguồn và xây dựng một cái bình chỉ với các lớp tôi cần không? Những công cụ hiện có nào có thể giúp tự động hóa điều này (ví dụ: tôi đã xem qua số http://code.google.com/p/jarjar/)?

Cảm ơn bạn

Sửa 1: Tôi muốn giảm kích thước của bên thứ ba của tôi lọ 'chính thức' như swingx-1.6.jar (1,4 MB), set-3,6 (1,7 MB) glazedlists -1.8.jar (820kB), vv để họ chỉ chứa các lớp học tối thiểu tôi cần

chỉnh sửa 2: Giảm thiểu một lọ bằng tay hoặc bằng cách sử dụng một chương trình như Proguard là tiếp tục phức tạp nếu việc sử dụng thư viện phản ánh. Injection with google guice does not work anymore after obfuscation with proguard

Câu trả lời bởi cletus về bài đăng khác là rất tốt How to determine which classes are used by a Java program?

Trả lời

5

Proguard sẽ là một lựa chọn. Nó có thể loại bỏ các lớp và phương thức không sử dụng. Bạn cũng có thể sử dụng nó để làm xáo trộn, điều này có thể làm giảm kích thước của lọ cuối cùng của bạn. Xin lưu ý rằng việc tải lớp theo tên có thể bị ngắt trừ khi việc chăm sóc được thực hiện để giữ cho các lớp bị ảnh hưởng không bị che khuất.

Tôi thấy Proguard khá hiệu quả - có thể hơi khó hiểu một chút để hiểu ngay từ đầu. Nhưng tôi không có bất kỳ kinh nghiệm nào tương tự để đưa ra một so sánh.

+0

Tôi đã sử dụng Proguard để làm xáo trộn lọ ứng dụng của tôi với kết quả tốt và nhận thấy kích thước đầu ra nhỏ hơn. Tôi cũng gặp vấn đề với 'các lớp bị hỏng' như bạn đề cập, với các đối tượng xstream, cho đến khi tôi thêm chúng vào phần "giữ". Tôi đã không sử dụng proguard để giảm kích thước của lọ phụ thuộc của tôi mặc dù - là điều này có thể? –

+0

@brian_d - vâng, có thể sử dụng -injars/-outjars. Tôi đoán 'mức độ khó' sẽ liên quan đến số lượng lọ bạn có. Một ví dụ sử dụng tôi đã có được mã hóa bouncycastle. Tôi đã có thể chỉ cần bao gồm các lớp học tôi cần thiết, loại bỏ tất cả các mã cho các thuật toán không sử dụng, vv –

+0

cảm ơn cho đề nghị này, tôi sẽ cung cấp cho một thử. –

0

Trước hết, nếu bạn chỉ sử dụng một lớp từ tệp JAR, điều này không có nghĩa là lớp này không sử dụng lớp khác được phân loại từ JAR đó. Tùy chọn cho bạn, nếu bạn sử dụng các mã nguồn mở JAR, là lấy các nguồn của JAR đó, đính kèm chúng vào dự án của bạn, loại bỏ các công cụ không cần thiết và tự xây dựng các thay đổi.

+0

Vẫn còn có vấn đề như đã đề cập trong 'Chỉnh sửa số 2' của tôi. Tôi giảm swingx bằng tay từ 1,4MB đến 160kB. Nó được xây dựng tốt, nhưng đã bị lỗi khi chạy vì một số cuộc gọi lớp phương thức phản chiếu không được bao gồm. –

0

Bạn có thể thêm GenJar làm tác vụ Ant và sử dụng nó để tạo JAR. Như nó nói trên trang chủ của thư viện,

GenJar là một nhiệm vụ Ant chuyên dụng xây dựng tập tin jar dựa trên lớp phụ thuộc chứ không phải chỉ đơn giản là nội dung của một thư mục.

Bạn có thể tìm thấy nó trên SourceForge.

+1

Tôi không nhận được gì ngoài thất vọng với GenJar, với lỗi 'Không thể giải quyết'.Có vẻ như nó chưa được cập nhật kể từ 2003-03-06. –

+0

Tôi thấy rằng GenJar Không thể giải quyết các vấn đề đã biến mất khi tôi sử dụng Java 7 thay vì Java 8 – Jon