Sự khác biệt giữa các tùy chọn xử lý thư viện jar runnable là gì?


79

Vì vậy, tôi sẽ sử dụng Java Web Start để triển khai ứng dụng java. Khi xuất sang Runnable Jar, có ba tùy chọn trong Eclipse Helios.

  • Trích xuất các thư viện cần thiết vào JAR
  • Đóng gói các thư viện bắt buộc vào JAR
  • Sao chép các thư viện cần thiết vào thư mục con bên cạnh JAR.

Sự khác biệt là gì và chúng sẽ ảnh hưởng như thế nào đến tệp .jnlp của tôi?

Nếu đó là một jar đơn, không phải dễ dàng hơn vì tôi sẽ không phải viết tất cả các đường dẫn khác nhau đến tất cả các thư viện mà nó sử dụng?

Nếu có những thay đổi trong cả thư viện và ứng dụng, một lọ đơn sẽ là giải pháp tốt hơn? Hay tôi cần <jar href=''>cho từng thư viện riêng lẻ?

Cũng lưu ý rằng tôi cần sử dụng các thư viện gốc như tệp .dll và .so.

Câu trả lời:


142
  1. Trích xuất các thư viện cần thiết vào JAR - Trích xuất các .classtệp thực tế từ các thư viện mà ứng dụng của bạn sử dụng và đặt các .classtệp đó bên trong JAR có thể chạy được. Vì vậy, JAR có thể chạy được sẽ không chỉ chứa các .classtệp của ứng dụng của bạn mà còn chứa các .classtệp của tất cả các thư viện mà ứng dụng của bạn sử dụng.

  2. Đóng gói các thư viện bắt buộc vào JAR - Đặt các tệp JAR thực tế của các thư viện vào JAR có thể chạy được của bạn. Thông thường, tệp JAR trong tệp JAR không thể được tải bởi JVM. Nhưng Eclipse thêm các lớp đặc biệt vào JAR có thể chạy được để làm cho điều này trở nên khả thi.

  3. Sao chép các thư viện cần thiết vào thư mục con bên cạnh JAR - Giữ các thư viện JAR tách biệt hoàn toàn với JAR có thể chạy được, vì vậy JAR có thể chạy được sẽ chỉ chứa các .classtệp của ứng dụng của bạn.

Tùy chọn # 2 rất tiện lợi vì nó gói mọi thứ gọn gàng vào một JAR duy nhất và giữ các JAR thư viện tách biệt khỏi .classcác tệp ứng dụng của bạn .

Tuy nhiên, nhược điểm của việc đóng gói mọi thứ bên trong một JAR duy nhất (tùy chọn # 1 và # 2) là nếu bạn cập nhật ứng dụng của mình, thì người dùng sẽ phải tải xuống nhiều dữ liệu hơn để cập nhật ứng dụng. Nếu các JAR được giữ riêng biệt, thì người dùng sẽ chỉ phải tải xuống JAR có chứa mã ứng dụng của bạn, thay vì một JAR lớn chứa mã ứng dụng của bạn tất cả mã thư viện.


Tò mò, còn việc tạo ra một cái lọ không chạy được thì sao? có sự khác biệt nào không?
KJW

10
@KimJongWoo Bạn có thể "thực thi" các JAR có thể chạy được như thế này java -jar myjar.jarvì JAR xác định vị trí của một main()phương thức trong tệp "META-INF / MANIFEST.MF" của nó. Cài đặt "Lớp chính" bên trong tệp này xác định lớp có main()phương thức. JAR "bình thường" có xu hướng không có cài đặt này, vì vậy bạn không thể "thực thi" chúng theo cùng một cách.
Michael

1
@Michael, Chà để triển khai các ứng dụng độc lập (không cập nhật phiên bản), không phải tùy chọn 1 là lựa chọn hiển nhiên phải không? Nó cũng có vẻ là giải pháp tổ hợp tinh gọn và tốn ít byte nhất phải không?
Pacerier

1
Một lọ có chiết xuất nhanh hơn gói ?? Về tốc độ tải và đang thực thi
Nhà phát triển

1
@ Developer66 Dự đoán của tôi là mọi khác biệt về hiệu suất là không đáng kể.
Michael
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.