Mùa xuân với Maven BOM

1. Khái quát chung

Trong hướng dẫn nhanh này, chúng ta sẽ xem xét cách Maven, một công cụ dựa trên khái niệm Mô hình Đối tượng Dự án (POM), có thể sử dụng BOM hoặc “Bill Of Materials”.

Để biết thêm chi tiết về Maven, bạn có thể xem bài viết Hướng dẫn sử dụng Apache Maven của chúng tôi.

2. Các khái niệm quản lý phụ thuộc

Để hiểu BOM là gì và chúng ta có thể sử dụng nó để làm gì, trước tiên chúng ta cần tìm hiểu các khái niệm cơ bản.

2.1. Maven POM là gì?

Maven POM là một tệp XML chứa thông tin và cấu hình (về dự án) được Maven sử dụng để nhập các phần phụ thuộc và xây dựng dự án.

2.2. Maven BOM là gì?

BOM là viết tắt của Bill Of Materials. BOM là một loại POM đặc biệt được sử dụng để kiểm soát các phiên bản của các phần phụ thuộc của dự án và cung cấp một vị trí trung tâm để xác định và cập nhật các phiên bản đó.

BOM cung cấp sự linh hoạt để thêm phần phụ thuộc vào mô-đun của chúng tôi mà không cần lo lắng về phiên bản mà chúng tôi nên phụ thuộc vào.

2.3. Phụ thuộc bắc cầu

Maven có thể khám phá các thư viện cần thiết bởi các phụ thuộc của chính chúng ta trong pom.xml của chúng tôi và tự động đưa chúng vào. Không có giới hạn về số lượng cấp độ phụ thuộc mà các thư viện được thu thập từ đó.

Xung đột ở đây xảy ra khi 2 phụ thuộc tham chiếu đến các phiên bản khác nhau của một tạo tác cụ thể. Cái nào sẽ được Maven đưa vào?

Câu trả lời ở đây là “định nghĩa gần nhất”. Điều này có nghĩa là phiên bản được sử dụng sẽ là phiên bản gần nhất với dự án của chúng tôi trong cây phụ thuộc. Đây được gọi là hòa giải phụ thuộc.

Hãy xem ví dụ sau để làm rõ dàn xếp phụ thuộc:

A -> B -> C -> D 1.4 and A -> E -> D 1.0

Ví dụ này cho thấy rằng dự án A phụ thuộc vào BE. BE có các phụ thuộc riêng của chúng mà gặp phải các phiên bản khác nhau của tạo tác D. Tạo tác D 1.0 sẽ được sử dụng trong quá trình xây dựng dự án A vì đường dẫn qua E ngắn hơn.

Có các kỹ thuật khác nhau để xác định phiên bản hiện vật nào nên được đưa vào:

  • Chúng tôi luôn có thể đảm bảo một phiên bản bằng cách khai báo nó một cách rõ ràng trong POM của dự án của chúng tôi. Ví dụ, để đảm bảo rằng D 1.4 được sử dụng, chúng ta nên thêm nó một cách rõ ràng làm phụ thuộc trong tệp pom.xml .
  • Chúng tôi có thể sử dụng phần Quản lý phụ thuộc để kiểm soát các phiên bản tạo tác như chúng tôi sẽ giải thích ở phần sau của bài viết này.

2.4. Quản lý sự phụ thuộc

Nói một cách đơn giản, Quản lý phụ thuộc là một cơ chế để tập trung thông tin phụ thuộc.

Khi chúng ta có một tập hợp các dự án kế thừa một nguồn gốc chung, chúng ta có thể đặt tất cả thông tin phụ thuộc vào một tệp POM dùng chung được gọi là BOM.

Sau đây là một ví dụ về cách ghi tệp BOM:

 4.0.0 baeldung Baeldung-BOM 0.0.1-SNAPSHOT pom BaelDung-BOM parent pom    test a 1.2   test b 1.0 compile   test c 1.0 compile    

Như chúng ta có thể thấy, BOM là một tệp POM bình thường có phần Quản lý phụ thuộc , nơi chúng ta có thể bao gồm tất cả các thông tin và phiên bản của tạo tác.

2.5. Sử dụng tệp BOM

Có 2 cách để sử dụng tệp BOM trước đó trong dự án của chúng tôi và sau đó chúng tôi sẽ sẵn sàng khai báo các phụ thuộc của mình mà không cần phải lo lắng về số phiên bản.

Chúng ta có thể kế thừa từ cha mẹ:

 4.0.0 baeldung Test 0.0.1-SNAPSHOT pom Test  baeldung Baeldung-BOM 0.0.1-SNAPSHOT  

Như chúng ta có thể thấy Test dự án của chúng tôi kế thừa Baeldung-BOM.

Chúng tôi cũng có thể nhập BOM.

Trong các dự án lớn hơn, cách tiếp cận kế thừa không hiệu quả vì dự án chỉ có thể kế thừa một cha mẹ duy nhất. Nhập là một lựa chọn thay thế vì chúng tôi có thể nhập bao nhiêu BOM tùy ý.

Hãy xem cách chúng tôi có thể nhập tệp BOM vào POM dự án của chúng tôi:

 4.0.0 baeldung Test 0.0.1-SNAPSHOT pom Test    baeldung Baeldung-BOM 0.0.1-SNAPSHOT pom import    

2.6. Ghi đè Phụ thuộc BOM

Thứ tự ưu tiên của phiên bản tạo tác là:

  1. Phiên bản khai báo trực tiếp của tạo tác trong dự án pom của chúng tôi
  2. Phiên bản của tạo tác trong dự án mẹ
  3. Phiên bản trong pom đã nhập, có tính đến thứ tự nhập tệp
  4. hòa giải phụ thuộc
  • Chúng tôi có thể ghi đè phiên bản của tạo tác bằng cách xác định rõ ràng tạo tác trong bản pom của dự án của chúng tôi với phiên bản mong muốn
  • Nếu cùng một cấu phần phần mềm được xác định với các phiên bản khác nhau trong 2 BOM đã nhập, thì phiên bản trong tệp BOM được khai báo trước sẽ giành chiến thắng

3. BOM mùa xuân

Chúng tôi có thể nhận thấy rằng một thư viện của bên thứ ba hoặc một dự án Spring khác, kéo một phụ thuộc bắc cầu vào một bản phát hành cũ hơn. Nếu chúng ta quên khai báo rõ ràng một phụ thuộc trực tiếp, các vấn đề không mong muốn có thể phát sinh.

Để khắc phục những vấn đề như vậy, Maven ủng hộ khái niệm phụ thuộc BOM.

Chúng tôi có thể nhập Spring-framework-bom trong phần dependencyManagement của mình để đảm bảo rằng tất cả các phụ thuộc Spring đều ở cùng một phiên bản:

   org.springframework spring-framework-bom 4.3.8.RELEASE pom import   

Chúng tôi không cần chỉ định thuộc tính phiên bản khi chúng tôi sử dụng các tạo tác Spring như trong ví dụ sau:

  org.springframework spring-context   org.springframework spring-web  

4. Kết luận

Trong bài viết nhanh này, chúng tôi đã chỉ ra Khái niệm Maven Bill-Of-Material và cách tập trung thông tin và phiên bản của tạo tác trong một POM chung.

Nói một cách đơn giản, sau đó chúng ta có thể kế thừa hoặc nhập nó để tận dụng các lợi ích BOM.

Các ví dụ mã trong bài viết có thể được tìm thấy trên GitHub.