Maven - Quản lý sự phụ thuộc

Một trong những tính năng cốt lõi của Maven là Quản lý sự phụ thuộc. Quản lý sự phụ thuộc là một nhiệm vụ khó khăn khi chúng ta phải giải quyết các dự án nhiều mô-đun (bao gồm hàng trăm mô-đun / dự án con). Maven cung cấp mức độ kiểm soát cao để quản lý các tình huống như vậy.

Khám phá phụ thuộc bắc cầu

Thường là một trường hợp, khi một thư viện, ví dụ A, phụ thuộc vào thư viện khác, ví dụ B. Trong trường hợp một dự án C khác muốn sử dụng A, thì dự án đó cũng yêu cầu sử dụng thư viện B.

Maven giúp tránh các yêu cầu như vậy để khám phá tất cả các thư viện được yêu cầu. Maven làm như vậy bằng cách đọc các tệp dự án (pom.xml) của các phụ thuộc, tìm ra các phụ thuộc của chúng, v.v.

Chúng ta chỉ cần xác định sự phụ thuộc trực tiếp trong mỗi bản pom dự án. Maven tự động xử lý phần còn lại.

Với sự phụ thuộc bắc cầu, biểu đồ của các thư viện được đưa vào có thể nhanh chóng phát triển ở mức độ lớn. Các trường hợp có thể phát sinh khi có các thư viện trùng lặp. Maven cung cấp một số tính năng để kiểm soát mức độ phụ thuộc bắc cầu.

Sr.No. Sự miêu tả yếu tố
1

Dependency mediation

Xác định phiên bản của phụ thuộc sẽ được sử dụng khi nhiều phiên bản của một cấu phần phần mềm gặp phải. Nếu hai phiên bản phụ thuộc có cùng độ sâu trong cây phụ thuộc, thì phụ thuộc được khai báo đầu tiên sẽ được sử dụng.

2

Dependency management

Trực tiếp chỉ định các phiên bản của tạo tác sẽ được sử dụng khi chúng gặp phải trong các phụ thuộc bắc cầu. Đối với một dự án ví dụ C có thể bao gồm B làm phụ thuộc trong phần Quản lý phụ thuộc của nó và trực tiếp kiểm soát phiên bản B nào sẽ được sử dụng khi nó được tham chiếu.

3

Dependency scope

Bao gồm các phụ thuộc theo giai đoạn hiện tại của bản dựng.

4

Excluded dependencies

Có thể loại trừ bất kỳ yếu tố phụ thuộc bắc cầu nào bằng cách sử dụng phần tử "loại trừ". Ví dụ, A phụ thuộc vào B và B phụ thuộc vào C, thì A có thể đánh dấu C là loại trừ.

5

Optional dependencies

Mọi phụ thuộc bắc cầu đều có thể được đánh dấu là tùy chọn bằng cách sử dụng phần tử "tùy chọn". Ví dụ, A phụ thuộc vào B và B phụ thuộc vào C. Bây giờ B đánh dấu C là tùy chọn. Khi đó A sẽ không sử dụng C.

Phạm vi phụ thuộc

Có thể hạn chế Khám phá Phụ thuộc Xuyên bằng nhiều Phạm vi Phụ thuộc khác nhau như được đề cập bên dưới.

Sr.No. Phạm vi & Mô tả
1

compile

Phạm vi này chỉ ra rằng sự phụ thuộc có sẵn trong classpath của dự án. Nó là phạm vi mặc định.

2

provided

Phạm vi này chỉ ra rằng sự phụ thuộc sẽ được cung cấp bởi JDK hoặc web-Server / Container trong thời gian chạy.

3

runtime

Phạm vi này chỉ ra rằng phụ thuộc không cần thiết để biên dịch, nhưng được yêu cầu trong quá trình thực thi.

4

test

Phạm vi này chỉ ra rằng sự phụ thuộc chỉ có sẵn cho các giai đoạn biên dịch và thực thi thử nghiệm.

5

system

Phạm vi này chỉ ra rằng bạn phải cung cấp đường dẫn hệ thống.

6

import

Phạm vi này chỉ được sử dụng khi phụ thuộc thuộc loại pom. Phạm vi này chỉ ra rằng POM đã chỉ định nên được thay thế bằng các phụ thuộc trong phần <dependencyManagement> của POM đó.

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

Thông thường, chúng tôi có một tập hợp các dự án trong một dự án chung. Trong trường hợp như vậy, chúng ta có thể tạo một pom chung có tất cả các phụ thuộc chung và sau đó tạo pom này, cha mẹ của các pom của dự án con. Ví dụ sau sẽ giúp bạn hiểu khái niệm này.

Sau đây là chi tiết của đồ thị phụ thuộc ở trên:

  • App-UI-WAR phụ thuộc vào App-Core-lib và App-Data-lib.
  • Root là cha của App-Core-lib và App-Data-lib.
  • Root định nghĩa Lib1, lib2, Lib3 là các phụ thuộc trong phần phụ thuộc của nó.

App-UI-WAR

<project xmlns = "http://maven.apache.org/POM/4.0.0"
   xmlns:xsi = "http://www.w3.org/2001/XMLSchema-instance"
   xsi:schemaLocation = "http://maven.apache.org/POM/4.0.0
   http://maven.apache.org/xsd/maven-4.0.0.xsd">
   <modelVersion>4.0.0</modelVersion>
   <groupId>com.companyname.groupname</groupId>
   <artifactId>App-UI-WAR</artifactId>
   <version>1.0</version>
   <packaging>war</packaging>
   <dependencies>
      <dependency>
         <groupId>com.companyname.groupname</groupId>
         <artifactId>App-Core-lib</artifactId>
         <version>1.0</version>
      </dependency>
   </dependencies>  
   <dependencies>
      <dependency>
         <groupId>com.companyname.groupname</groupId>
         <artifactId>App-Data-lib</artifactId>
         <version>1.0</version>
      </dependency>
   </dependencies>  
</project>

App-Core-lib

<project xmlns = "http://maven.apache.org/POM/4.0.0"
   xmlns:xsi = "http://www.w3.org/2001/XMLSchema-instance"
   xsi:schemaLocation = "http://maven.apache.org/POM/4.0.0
   http://maven.apache.org/xsd/maven-4.0.0.xsd">
   <parent>
      <artifactId>Root</artifactId>
      <groupId>com.companyname.groupname</groupId>
      <version>1.0</version>
   </parent>
   <modelVersion>4.0.0</modelVersion>
   <groupId>com.companyname.groupname</groupId>
   <artifactId>App-Core-lib</artifactId>
   <version>1.0</version> 
   <packaging>jar</packaging>
</project>

App-Data-lib

<project xmlns = "http://maven.apache.org/POM/4.0.0"
   xmlns:xsi = "http://www.w3.org/2001/XMLSchema-instance"
   xsi:schemaLocation = "http://maven.apache.org/POM/4.0.0
   http://maven.apache.org/xsd/maven-4.0.0.xsd">
   <parent>
      <artifactId>Root</artifactId>
      <groupId>com.companyname.groupname</groupId>
      <version>1.0</version>
   </parent>
   <modelVersion>4.0.0</modelVersion>
   <groupId>com.companyname.groupname</groupId>
   <artifactId>App-Data-lib</artifactId>
   <version>1.0</version>   
   <packaging>jar</packaging>
</project>

Root

<project xmlns = "http://maven.apache.org/POM/4.0.0"
   xmlns:xsi = "http://www.w3.org/2001/XMLSchema-instance"
   xsi:schemaLocation = "http://maven.apache.org/POM/4.0.0
   http://maven.apache.org/xsd/maven-4.0.0.xsd">
   <modelVersion>4.0.0</modelVersion>
   <groupId>com.companyname.groupname</groupId>
   <artifactId>Root</artifactId>
   <version>1.0</version>
   <packaging>pom</packaging>
   <dependencies>
      <dependency>
         <groupId>com.companyname.groupname1</groupId>
         <artifactId>Lib1</artifactId>
         <version>1.0</version>
      </dependency>
   </dependencies>  
   <dependencies>
      <dependency>
         <groupId>com.companyname.groupname2</groupId>
         <artifactId>Lib2</artifactId>
         <version>2.1</version>
      </dependency>
   </dependencies>  
   <dependencies>
      <dependency>
         <groupId>com.companyname.groupname3</groupId>
         <artifactId>Lib3</artifactId>
         <version>1.1</version>
      </dependency>
   </dependencies>  
</project>

Bây giờ khi chúng tôi xây dựng dự án App-UI-WAR, Maven sẽ khám phá tất cả các phụ thuộc bằng cách duyệt qua biểu đồ phụ thuộc và xây dựng ứng dụng.

Từ ví dụ trên, chúng ta có thể tìm hiểu các khái niệm chính sau:

  • Các phụ thuộc chung có thể được đặt ở một nơi duy nhất bằng cách sử dụng khái niệm pom mẹ. Sự phụ thuộc củaApp-Data-libApp-Core-libdự án được liệt kê trong dự án Gốc (Xem kiểu đóng gói của Gốc. Nó là POM).

  • Không cần chỉ định Lib1, lib2, Lib3 làm phụ thuộc trong App-UI-WAR. Maven sử dụngTransitive Dependency Mechanism để quản lý chi tiết đó.