2010-05-08 26 views
5

Làm thế nào để bạn xác định lọ nào là cần thiết cho tính năng như vậy và như vậy của một khuôn khổ? Ví dụ, những cái bình nào sẽ cần cho tất cả những cái có sẵn cho Spring để chỉ hỗ trợ tiêm phụ thuộc?Xác định những cái lọ tối thiểu là cần thiết cho một tính năng

+3

Kiểm tra, thử nghiệm, kiểm tra. Nhưng thông thường nếu khuôn khổ nói rằng nó cần tất cả các lọ, bạn tốt hơn cung cấp tất cả các lọ, nếu không bạn đang ở trên của riêng bạn. –

+1

Ví dụ là Spring. Gần như tất cả các phụ thuộc bên thứ ba của nó được đánh dấu là tùy chọn trong POM Maven. Tôi đồng ý rằng thử nghiệm là "bắt tất cả" cho việc này, nhưng đó là một câu hỏi hay - tôi thường muốn tìm cách để biết thời gian chạy mà thư viện thực sự được sử dụng. Tôi đã sử dụng Trình biên dịch gốc của Java trước thời gian - điều này ghi lại tất cả các lớp được sử dụng và các lọ mà chúng xuất phát từ đó. Bạn có thể mô phỏng một thứ tương tự với trình nạp lớp tùy chỉnh theo dõi các lớp được nạp và sử dụng Class.getResource() để xác định vị trí. – mdma

Trả lời

4

Có các công cụ tạo các JAR tối thiểu bằng cách tìm ra lớp nào thực sự được sử dụng trong ứng dụng bằng cách phân tích tĩnh mã, sau đó tạo một JAR mới chỉ chứa những lớp đó. (. Tôi nhớ lại sử dụng Zelix Classmaster để làm điều này, nhưng có rất nhiều lựa chọn thay thế)

Vấn đề với việc sử dụng những công cụ này cho một khuôn khổ DI như mùa xuân bao gồm:

  • duy nhất theo dõi phụ thuộc tĩnh hiện có. Nếu bạn tự động tải các lớp học, bạn phải nói cụ thể với máy phân tích về từng lớp. Các khung công tác DI nói chung và Mùa xuân nói riêng là đầy đủ với tải động, bao gồm cả tải động không rõ ràng đối với mã ứng dụng.

  • Các công cụ hiện có hoạt động bằng cách tạo một JAR đầu ra mới, không phải bằng cách cho bạn biết JAR đầu vào nào không được sử dụng. Trong khi đóng gói lại các JAR là OK nếu bạn đang tạo một ứng dụng được thu hẹp từ một codebase nguồn đóng, thì nó là không mong muốn nói chung, và có khả năng có vấn đề với một số giấy phép mã nguồn mở. Chắc chắn bạn không muốn làm điều này với Spring.

Về lý thuyết, ai đó có thể viết công cụ trợ giúp. Trong thực tế, công cụ sẽ cần (ví dụ) biết cách trích xuất các phụ thuộc lớp động từ các cấu hình Spring được biểu diễn trong các chú thích, XML và từ các bộ mô tả bean được tạo ra trong thời gian chạy từ cấu hình bậc cao hơn (ví dụ SpringSecurity). Đó là một yêu cầu lớn. Và thậm chí sau đó bạn có vấn đề là sự thay đổi "nhỏ" đối với các dây dẫn được thực hiện trên nền tảng cài đặt có thể không thành công do các JAR cần thiết bị bỏ qua bởi quá trình cắt tỉa JAR.

Theo quan điểm của tôi, các giải pháp thay thế thực tế hơn là:

  • Nếu bạn sử dụng Maven/Ivy để quản lý phụ thuộc của bạn, nhìn vào đồ thị phụ thuộc, loại bỏ sự phụ thuộc có vẻ như là không còn cần thiết ... và kiểm tra, kiểm tra, kiểm tra.
  • Bỏ thủ công các tệp JAR xuất hiện để không sử dụng ... và kiểm tra, thử nghiệm, kiểm tra.
  • Đừng lo lắng về điều đó. Một mức độ vừa phải của JAR cruft không sử dụng có thể thêm một hoặc hai giây để triển khai và thời gian khởi động webapp, nhưng điều đó thường không quan trọng. (Nhưng nếu có ... xem ở trên.)
+1

[Proguard] (http://proguard.sourceforge.net) là một ví dụ khác có thể làm điều đó (và hơn thế nữa). – BalusC

+0

@BalusC - và chắc chắn có những ví dụ đáng giá khác. Nhưng thật không may, họ không thực sự giải quyết vấn đề * này *. –

+0

Tôi đã đề cập đến đoạn 1 :) Trước khi bạn chỉnh sửa các lựa chọn thay thế thực tế, mà tôi tuy nhiên hoàn toàn đồng ý (+1). – BalusC

1

Đây là lý do tại sao một số dự án Java cũ hơn có 600 Chum và 200 MB tập tin chiến tranh, cho một ứng dụng 10.000 dòng. Loại đau đớn nếu bạn không quản lý cẩn thận ...

0

Bạn thực sự nên hỏi nhà cung cấp khung hoặc đọc tài liệu. Phân tích tĩnh những lọ được yêu cầu có thể không đủ trong một số trường hợp (tải động) và đôi khi bạn có thể kết thúc với quá nhiều lọ.

Tôi đã từng thực hiện một số công cụ trợ giúp ftp cho một loại thư viện "tiện ích". Nó phụ thuộc vào một số apache ftp jar. Nếu bạn không bao giờ sử dụng các tính năng ftp trong thư viện, bạn sẽ không cần đến jar ftp nhưng phân tích thống kê mã có thể nói bạn cần nó. Đây là một cái gì đó bạn nên tài liệu.

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