Quản lý các phụ thuộc trong Maven
1. Các thư viện phụ thuộc nhau thế nào trong Maven
Maven là một công cụ tuyệt vời giúp bạn khám phá thế giới mã nguồn mở trong Java. Nhưng đôi khi bạn không hiểu hết về Maven để kiểm soát nó. Và như vậy có một số lỗi không rõ nguyên nhân xẩy ra.
Trong tài liệu này tôi hướng dẫn bạn làm thế nào tránh trùng lặp thư viện trong Maven.
Để đơn giản bạn hãy xem nội dung của một file pom.xml sau:
pom.xml
<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/maven-v4_0_0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>org.o7planning</groupId>
<artifactId>SimpleMavenWebApp</artifactId>
<packaging>war</packaging>
<version>0.0.1-SNAPSHOT</version>
<name>SimpleMavenWebApp Maven Webapp</name>
<url>http://maven.apache.org</url>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>3.8.1</version>
<scope>test</scope>
</dependency>
<!-- JSTL Library -->
<!-- http://mvnrepository.com/artifact/org.glassfish.web/javax.servlet.jsp.jstl -->
<dependency>
<groupId>org.glassfish.web</groupId>
<artifactId>javax.servlet.jsp.jstl</artifactId>
<version>1.2.4</version>
</dependency>
</dependencies>
<build>
<finalName>SimpleMavenWebApp</finalName>
</build>
</project>
File pom.xml trên bạn đã khai báo sử dụng thư viện javax.servlet.jsp.jstl, thư viện này phụ thuộc vào jstl-api. Và jstl-api lại phụ thuộc vào 2 thư viện servlet-api và jsp-api. Sự phụ thuộc đó giống như hình minh họa dưới đây:
Trên Eclipse bạn có thể nhìn thấy cây minh họa sự phụ thuộc này:
Thư viện sẽ được sử dụng là các thư viện bạn khai báo với Maven và các thư viện phụ thuộc.
2. Loại bỏ sự trùng lặp thư viện
Khi khai báo thư viện trên Maven, có thể gây ra sự trùng lặp thư viện, chẳng hạn bạn khai báo sử dụng 2 thư viện A và B với Maven. A phụ thuộc vào C và D, còn B phụ thuộc vào C và E. Khi đó thư viện C sẽ bị trùng lặp. Bạn có thể xem hình minh họa dưới đây.
Hình minh họa trên cho thấy có 2 phiên bản thư viện C sẽ được sử dụng, điều này có thể gây ra lỗi trong quá trình chạy của ứng dụng. Bạn cần cấu hình để loại bỏ một trong 2 phiên bản của thư viện C. Thông thường bạn cần loại bỏ phiên bản cũ hơn.
Sử dụng <exclusions> để loại bỏ các thư viện phụ thuộc bạn không muốn sử dụng.
Sử dụng <exclusions> để loại bỏ các thư viện phụ thuộc bạn không muốn sử dụng.
<dependencies>
<dependency>
<groupId>aa</groupId>
<artifactId>A</artifactId>
<version>1.1</version>
</dependency>
<dependency>
<groupId>bb</groupId>
<artifactId>B</artifactId>
<version>1.1</version>
<exclusions>
<exclusion>
<artifactId>C</artifactId>
<groupId>cc</groupId>
</exclusion>
</exclusions>
</dependency>
</dependencies>
Công cụ của Eclipse hỗ trợ bạn phát hiện ra các trùng lặp và loại bỏ chúng. Hãy xem một ví dụ:
pom.xml
<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/maven-v4_0_0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>org.o7planning</groupId>
<artifactId>SimpleMavenWebApp</artifactId>
<packaging>war</packaging>
<version>0.0.1-SNAPSHOT</version>
<name>SimpleMavenWebApp Maven Webapp</name>
<url>http://maven.apache.org</url>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>3.8.1</version>
<scope>test</scope>
</dependency>
<!-- Servlet API - Servlet Library -->
<!-- http://mvnrepository.com/artifact/javax.servlet/javax.servlet-api -->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>3.1.0</version>
<scope>provided</scope>
</dependency>
<!-- JSTL Library -->
<!-- http://mvnrepository.com/artifact/org.glassfish.web/javax.servlet.jsp.jstl -->
<dependency>
<groupId>org.glassfish.web</groupId>
<artifactId>javax.servlet.jsp.jstl</artifactId>
<version>1.2.4</version>
</dependency>
</dependencies>
<build>
<finalName>SimpleMavenWebApp</finalName>
</build>
</project>
Nhấn phải chuột vào thư viện phụ thuộc cần loại trừ, chọn Exclude Maven Artifact...
Eclipse sẽ tự động thêm đoạn code <exclusions> vào pom.xml:
Bây giờ file pom.xml của bạn không còn sự trùng lặp thư viện:
Các hướng dẫn Maven
- Cài đặt Maven cho Eclipse
- Hướng dẫn sử dụng Maven cho người mới bắt đầu
- Quản lý các phụ thuộc trong Maven
- Xây dựng dự án nhiều Module với Maven
- Chạy ứng dụng Java web Maven trên Tomcat Maven Plugin
- Chạy ứng dụng Java Web Maven trên Jetty Maven Plugin
- Cài đặt Tycho cho Eclipse
- Tạo dự án Java OSGi với Maven và Tycho
- Tạo Maven Web App Project rỗng trong Eclipse
- Tương tác OSGi và AspectJ
Show More