dependency-maven

Giới thiệu về Cơ chế dependency trong Maven (phần 3)

Quản lý sự phụ thuộc là một tính năng cốt lõi của Maven. Dễ dàng quản lý các phần phụ thuộc cho một dự án. Có thể quản lý các phần phụ thuộc cho các dự án nhiều mô-đun và các ứng dụng bao gồm hàng trăm mô-đun. Maven giúp rất nhiều trong việc xác định, tạo và duy trì các bản dựng có thể tái tạo với các đường dẫn và phiên bản thư viện được xác định rõ ràng.

Quản lý dependency

Phần quản lý phụ thuộc là một cơ chế để tập trung thông tin phụ thuộc. Khi bạn có một tập hợp các dự án kế thừa từ một nguồn gốc chung, bạn có thể đặt tất cả thông tin về sự phụ thuộc vào POM chung và có các tham chiếu đơn giản hơn đến các tạo tác trong POM con. Cơ chế này được minh họa rõ nhất qua một số ví dụ. Đưa ra hai POM mở rộng cùng một nguồn gốc:

Project A:

<project> ... <dependencies> <dependency> <groupId>group-a</groupId> <artifactId>artifact-a</artifactId> <version>1.0</version> <exclusions> <exclusion> <groupId>group-c</groupId> <artifactId>excluded-artifact</artifactId> </exclusion> </exclusions> </dependency> <dependency> <groupId>group-a</groupId> <artifactId>artifact-b</artifactId> <version>1.0</version> <type>bar</type> <scope>runtime</scope> </dependency> </dependencies> </project>
Code language: HTML, XML (xml)

Project B:

<project> ... <dependencies> <dependency> <groupId>group-c</groupId> <artifactId>artifact-b</artifactId> <version>1.0</version> <type>war</type> <scope>runtime</scope> </dependency> <dependency> <groupId>group-a</groupId> <artifactId>artifact-b</artifactId> <version>1.0</version> <type>bar</type> <scope>runtime</scope> </dependency> </dependencies> </project>
Code language: HTML, XML (xml)

Hai POM ví dụ này có chung một phụ thuộc và mỗi POM đều có một phụ thuộc không tầm thường. Thông tin này có thể được đưa vào POM mẹ như sau:

<project> ... <dependencyManagement> <dependencies> <dependency> <groupId>group-a</groupId> <artifactId>artifact-a</artifactId> <version>1.0</version> <exclusions> <exclusion> <groupId>group-c</groupId> <artifactId>excluded-artifact</artifactId> </exclusion> </exclusions> </dependency> <dependency> <groupId>group-c</groupId> <artifactId>artifact-b</artifactId> <version>1.0</version> <type>war</type> <scope>runtime</scope> </dependency> <dependency> <groupId>group-a</groupId> <artifactId>artifact-b</artifactId> <version>1.0</version> <type>bar</type> <scope>runtime</scope> </dependency> </dependencies> </dependencyManagement> </project>
Code language: HTML, XML (xml)

Sau đó, hai POM con trở nên đơn giản hơn nhiều:

<project> ... <dependencies> <dependency> <groupId>group-a</groupId> <artifactId>artifact-a</artifactId> </dependency> <dependency> <groupId>group-a</groupId> <artifactId>artifact-b</artifactId> <!-- This is not a jar dependency, so we must specify type. --> <type>bar</type> </dependency> </dependencies> </project>
Code language: HTML, XML (xml)
<project> ... <dependencies> <dependency> <groupId>group-c</groupId> <artifactId>artifact-b</artifactId> <!-- This is not a jar dependency, so we must specify type. --> <type>war</type> </dependency> <dependency> <groupId>group-a</groupId> <artifactId>artifact-b</artifactId> <!-- This is not a jar dependency, so we must specify type. --> <type>bar</type> </dependency> </dependencies> </project>
Code language: HTML, XML (xml)

LƯU Ý: Trong hai tham chiếu phụ thuộc này, chúng tôi phải chỉ định phần tử . Điều này là do tập hợp thông tin tối thiểu để so khớp một tham chiếu phụ thuộc với một phần dependencyManagement thực sự là {groupId, craftId, type, classifier}.

Trong nhiều trường hợp, các phụ thuộc này sẽ tham chiếu đến các tạo tác jar không có bộ phân loại. Điều này cho phép chúng ta viết tắt danh tính được đặt thành {groupId, ArtiId}, vì giá trị mặc định cho trường loại là jar và bộ phân loại mặc định là null.

Cách sử dụng thứ hai và rất quan trọng của phần quản lý phụ thuộc là kiểm soát các phiên bản của tạo tác được sử dụng trong các phụ thuộc bắc cầu. Ví dụ, hãy xem xét các dự án này:

Project A:

<project> <modelVersion>4.0.0</modelVersion> <groupId>maven</groupId> <artifactId>A</artifactId> <packaging>pom</packaging> <name>A</name> <version>1.0</version> <dependencyManagement> <dependencies> <dependency> <groupId>test</groupId> <artifactId>a</artifactId> <version>1.2</version> </dependency> <dependency> <groupId>test</groupId> <artifactId>b</artifactId> <version>1.0</version> <scope>compile</scope> </dependency> <dependency> <groupId>test</groupId> <artifactId>c</artifactId> <version>1.0</version> <scope>compile</scope> </dependency> <dependency> <groupId>test</groupId> <artifactId>d</artifactId> <version>1.2</version> </dependency> </dependencies> </dependencyManagement> </project>
Code language: HTML, XML (xml)

Project B:

<project> <parent> <artifactId>A</artifactId> <groupId>maven</groupId> <version>1.0</version> </parent> <modelVersion>4.0.0</modelVersion> <groupId>maven</groupId> <artifactId>B</artifactId> <packaging>pom</packaging> <name>B</name> <version>1.0</version> <dependencyManagement> <dependencies> <dependency> <groupId>test</groupId> <artifactId>d</artifactId> <version>1.0</version> </dependency> </dependencies> </dependencyManagement> <dependencies> <dependency> <groupId>test</groupId> <artifactId>a</artifactId> <version>1.0</version> <scope>runtime</scope> </dependency> <dependency> <groupId>test</groupId> <artifactId>c</artifactId> <scope>runtime</scope> </dependency> </dependencies> </project>
Code language: HTML, XML (xml)

Khi maven được chạy trên dự án B, phiên bản 1.0 của các tạo phẩm a, b, c và d sẽ được sử dụng bất kể phiên bản được chỉ định trong POM của chúng.

  • a và c đều được khai báo là phụ thuộc của dự án nên phiên bản 1.0 được sử dụng do hòa giải phụ thuộc. Cả hai đều có phạm vi thời gian chạy vì nó được chỉ định trực tiếp.
  • b được định nghĩa trong phần quản lý phụ thuộc cha của B và vì quản lý phụ thuộc được ưu tiên hơn so với dàn xếp phụ thuộc cho các phụ thuộc bắc cầu, phiên bản 1.0 sẽ được chọn nếu nó được tham chiếu trong POM của a hoặc c. b cũng sẽ có phạm vi biên dịch.
  • Cuối cùng, vì d được chỉ định trong phần quản lý phụ thuộc của B, nên d là phụ thuộc (hoặc phụ thuộc bắc cầu) của a hoặc c, phiên bản 1.0 sẽ được chọn – một lần nữa vì quản lý phụ thuộc được ưu tiên hơn so với dàn xếp phụ thuộc và cũng vì khai báo của POM hiện tại có ưu tiên hơn so với khai báo của cha mẹ của nó.

Trên đây mình đã giải thích cho bạn về cách quản lý dependency trong Maven. Mong rằng sẽ giúp ích cho bạn. Chúc bạn học tốt.

Bài viết liên quan

Leave a Reply

Your email address will not be published.