Quản lý các phụ thuộc trong Maven
Công ty Vĩnh Cửu tuyển dụng lập trình viên Java

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-apijsp-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.
<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:
Đến đây file pom.xml của bạn không còn sự trùng lặp thư viện: