Một bình uber là gì?


251

Tôi đang đọc tài liệu của Maven và bắt gặp cái tên 'uber-jar'.

Một uber-jar có nghĩa là gì và các tính năng / lợi thế của nó là gì?


14
Một thuật ngữ khác cho "bình uber" hoặc "siêu bình" là "bình mỡ". Xem stackoverflow.com/questions/19150811/ khăn .
erwaman

Tôi cũng thỉnh thoảng thấy nó được gọi là "onejar" hoặc "one-jar".
Jeen Broekstra

Câu trả lời:


357

Überlà từ Đức cho abovehay over(nó thực sự là cùng nguồn gốc với tiếng Anh over).

Do đó, trong bối cảnh này, uber-jar là "over-jar", một cấp độ tăng từ một JAR đơn giản (a) , được định nghĩa là một gói chứa cả gói của bạn tất cả các phụ thuộc của nó trong một tệp JAR duy nhất. Tên có thể được cho là đến từ cùng ổn định như ultrageek, siêu nhân, siêu không gian và siêu dữ liệu, tất cả đều có ý nghĩa tương tự "vượt quá mức bình thường".

Ưu điểm là bạn có thể phân phối uber-jar của bạn và không quan tâm chút nào hay không phụ thuộc được lắp đặt tại các điểm đến, như uber-jar của bạn thực sự không phụ thuộc.

Tất cả các phụ thuộc của công cụ của riêng bạn trong uber-jar cũng nằm trong uber-jar đó. Như tất cả các phụ thuộc của những phụ thuộc. Và như thế.


(a) Tôi có lẽ không cần phải giải thích JAR là gì đối với nhà phát triển Java nhưng tôi sẽ bao gồm nó để hoàn thiện. Đó là một kho lưu trữ Java, về cơ bản là một tệp thường chứa một số tệp lớp Java cùng với các tài nguyên và siêu dữ liệu liên quan.


Lạ thật ... Tôi là người Đức và dĩ nhiên biết từ "über" và nghĩa. Nhưng tại sao nó được sử dụng ở đây trong bối cảnh Maven? Trường hợp này có nghĩa là một hoặc nhiều thứ được tập hợp lại với nhau và được truy cập thông qua tệp được tạo. Unfortunateley gợi ý này đã không giải quyết vấn đề maven của tôi ;-)
Bjoern

7
BTW, überoverlà kết quả của một sự thay đổi giọng hát có hệ thống ở Old Đức mà cũng có thể được quan sát thấy trong các cặp từ: geben/give, leben/live, haben/have, heben/heavevà nhiều hơn nữa nhiều.
biziclop

Mô tả rất thông minh: Liên kết
Veniamin

Cho rằng tôi đã đau buồn đến mức nào khi cố gắng giáo dục mọi người, tôi đã quyết định loại bỏ những thứ mà một số người phàn nàn. Tôi vẫn định nghĩa uber trong ngữ cảnh tiếng Đức nhưng bài học lịch sử (hơi dài dòng) đã biến mất :-)
paxdiablo

58

bình ubar còn được gọi là bình chất béo tức là bình có phụ thuộc.
Có ba phương pháp phổ biến để xây dựng một bình uber:

  1. Unshaded: Giải nén tất cả các tệp JAR, sau đó đóng gói lại thành một JAR duy nhất. Hoạt động với trình nạp lớp mặc định của Java. Công cụ maven-assembly-plugin
  2. Shaded: Tương tự như shaded, nhưng đổi tên (nghĩa là "bóng râm") tất cả các gói của tất cả các phụ thuộc. Hoạt động với trình nạp lớp mặc định của Java. Tránh một số (không phải tất cả) xung đột phiên bản phụ thuộc. Công cụ maven-bóng-plugin
  3. JAR of JARs: Tệp JAR cuối cùng chứa các tệp JAR khác được nhúng bên trong. Tránh đụng độ phiên bản phụ thuộc. Tất cả các tệp tài nguyên được bảo tồn. Công cụ: Trình xuất tệp JAR của Eclipse

để biết thêm


57

Định nghĩa Paxdiablo là thực sự tốt.

Ngoài ra, vui lòng xem xét việc cung cấp một uber-jar đôi khi khá thú vị, nếu bạn thực sự muốn phân phối một phần mềm và không muốn khách hàng phải tự tải xuống phụ thuộc. Tóm lại, nếu chính sách của họ không cho phép sử dụng một số thư viện hoặc nếu họ phải ràng buộc một số thành phần phụ (slf4j, libs tuân thủ hệ thống, lib đặc biệt của vòm, ...) thì điều này có thể sẽ gây khó khăn cho họ .

Bạn có thể thực hiện điều đó:

Một giải pháp sạch hơn là cung cấp thư viện thir riêng; maven-bóng-plugin có mô tả cấu hình sẵn cho điều đó. Điều này không phức tạp hơn để làm (với maven và plugin của nó).

Cuối cùng, một giải pháp thực sự tốt là sử dụng Gói OSGI. Có rất nhiều hướng dẫn tốt về điều đó :)

Để biết thêm cấu hình, vui lòng đọc các chủ đề đó:


4

Một kho lưu trữ Java độc lập, có thể thực hiện được. Trong trường hợp của WildFly Swarm uberjars, đó là một tệp .jar duy nhất chứa ứng dụng của bạn, các phần của WildFly cần để hỗ trợ nó, một kho lưu trữ phụ thuộc Maven bên trong, cộng với một shim để khởi động tất cả. xem cái này


0

Các tên khác nhau chỉ là cách đóng gói các ứng dụng java.

Gầy - CHỈ chứa các bit bạn nhập vào trình soạn thảo mã theo nghĩa đen và KHÔNG CÓ gì khác.

Mỏng - Chứa tất cả các điều trên PLUS các phụ thuộc trực tiếp của ứng dụng vào ứng dụng của bạn (trình điều khiển db, thư viện tiện ích, v.v.).

Rỗng - Nghịch đảo của Thin - Chỉ chứa các bit cần thiết để chạy ứng dụng của bạn nhưng KHÔNG chứa chính ứng dụng đó. Về cơ bản, một máy chủ ứng dụng đã được đóng gói sẵn, mà sau đó bạn có thể triển khai ứng dụng của mình, theo cùng kiểu với các máy chủ ứng dụng Java EE truyền thống, nhưng có những khác biệt quan trọng.

Fat / Uber - Chứa bit bạn tự viết theo nghĩa đen CỘNG phụ thuộc trực tiếp vào ứng dụng của bạn PLUS các bit cần thiết để chạy ứng dụng của bạn trên ứng dụng của riêng bạn.

Nguồn: Bài viết từ Dzone

Đại diện trực quan của các loại JAR

Đăng lại từ: https://stackoverflow.com/a/57592130/9470346

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.