Khi các bạn phát triển một ứng dụng với nhiều Maven project khác nhau, chúng ta sẽ thường sử dụng một Maven parent project để quản lý các Maven project này. Nó sẽ giúp chúng ta có thể centralize việc quản lý version của các dependencies sử dụng cho ứng dụng, khi muốn nâng cấp version của một dependency nào đó, chúng ta chỉ cần thay đổi nó trong tập tin pom.xml của Maven parent project mà thôi. Một nhu cầu đặt ra là làm sao chúng ta có thể quản lý version của các Maven sub-project này để khi cần nâng cấp version của ứng dụng, chúng ta cũng chỉ sẽ cần thay đổi một chỗ mà thôi.
Ví dụ, mình có một Maven parent project với nội dung của tập tin pom.xml như sau:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
<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.huongdanjava</groupId> <artifactId>maven-parent</artifactId> <version>0.0.1-SNAPSHOT</version> <packaging>pom</packaging> <modules> <module>maven-example1</module> <module>maven-example2</module> </modules> <dependencyManagement> <dependencies> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>8.0.18</version> </dependency> </dependencies> </dependencyManagement> </project> |
với sub-project maven-example1 có tập tin pom.xml với nội dung như sau:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
<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> <parent> <groupId>com.huongdanjava</groupId> <artifactId>maven-parent</artifactId> <version>0.0.1-SNAPSHOT</version> <relativePath>../pom.xml</relativePath> </parent> <artifactId>maven-example1</artifactId> <dependencies> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> </dependency> </dependencies> </project> |
và sub-project maven-example2 có tập tin pom.xml với nội dung như sau:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
<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> <parent> <groupId>com.huongdanjava</groupId> <artifactId>maven-parent</artifactId> <version>${global.version}</version> <relativePath>../pom.xml</relativePath> </parent> <artifactId>maven-example2</artifactId> </project> |
Bây giờ nhu cầu của mình là khi muốn nâng cấp version của ứng dụng, mình chỉ cần change nó trong tập tin pom.xml của Maven parent project, là có thể effect tới các sub-project, không phải đi thay đổi cho từng tập tin pom.xml của các sub-project, tốn công lắm! 🙂
Giải pháp của các bạn là gì? Mình suggest giải pháp như sau:
Các bạn hãy thêm một property trong tập tin pom.xml của Maven parent project, ví dụ như sau:
1 2 3 |
<properties> <global.version>1.0-SNAPSHOT</global.version> </properties> |
Sau đó thì sử dụng property này để khai báo cho parent project:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 |
<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.huongdanjava</groupId> <artifactId>maven-parent</artifactId> <version>${global.version}</version> <packaging>pom</packaging> <properties> <global.version>1.0-SNAPSHOT</global.version> </properties> <modules> <module>maven-example1</module> <module>maven-example2</module> </modules> <dependencyManagement> <dependencies> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>8.0.18</version> </dependency> </dependencies> </dependencyManagement> </project> |
và tất cả các khai báo parent project trong các sub-project như sau:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
<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> <parent> <groupId>com.huongdanjava</groupId> <artifactId>maven-parent</artifactId> <version>${global.version}</version> <relativePath>../pom.xml</relativePath> </parent> <artifactId>maven-example1</artifactId> <dependencies> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> </dependency> </dependencies> </project> |
và:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
<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> <parent> <groupId>com.huongdanjava</groupId> <artifactId>maven-parent</artifactId> <version>${global.version}</version> <relativePath>../pom.xml</relativePath> </parent> <artifactId>maven-example2</artifactId> </project> |
Chạy build parent project, các bạn sẽ thấy kết quả như sau:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 |
... [INFO] ------------------------------------------------------------------------ [INFO] Reactor Build Order: [INFO] [INFO] maven-parent [pom] [INFO] maven-example1 [jar] [INFO] maven-example2 [jar] [INFO] [INFO] -------------------< com.huongdanjava:maven-parent >-------------------- [INFO] Building maven-parent 1.0-SNAPSHOT [1/3] [INFO] --------------------------------[ pom ]--------------------------------- ... [INFO] ------------------< com.huongdanjava:maven-example1 >------------------- [INFO] Building maven-example1 1.0-SNAPSHOT [2/3] [INFO] --------------------------------[ jar ]--------------------------------- ... [INFO] ------------------< com.huongdanjava:maven-example2 >------------------- [INFO] Building maven-example2 1.0-SNAPSHOT [3/3] [INFO] --------------------------------[ jar ]--------------------------------- ... [INFO] Reactor Summary for maven-parent 1.0-SNAPSHOT: [INFO] [INFO] maven-parent ....................................... SUCCESS [ 0.366 s] [INFO] maven-example1 ..................................... SUCCESS [ 0.851 s] [INFO] maven-example2 ..................................... SUCCESS [ 0.056 s] [INFO] ------------------------------------------------------------------------ [INFO] BUILD SUCCESS [INFO] ------------------------------------------------------------------------ [INFO] Total time: 1.396 s [INFO] Finished at: 2020-01-18T09:14:24+07:00 [INFO] ------------------------------------------------------------------------ |
Thay đổi giá trị của property ${global.version} thành 1.0 và build lại, các bạn sẽ thấy kết quả như sau:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 |
... [INFO] ------------------------------------------------------------------------ [INFO] Reactor Build Order: [INFO] [INFO] maven-parent [pom] [INFO] maven-example1 [jar] [INFO] maven-example2 [jar] [INFO] [INFO] -------------------< com.huongdanjava:maven-parent >-------------------- [INFO] Building maven-parent 1.0 [1/3] [INFO] --------------------------------[ pom ]--------------------------------- ... [INFO] ------------------< com.huongdanjava:maven-example1 >------------------- [INFO] Building maven-example1 1.0 [2/3] [INFO] --------------------------------[ jar ]--------------------------------- ... [INFO] ------------------< com.huongdanjava:maven-example2 >------------------- [INFO] Building maven-example2 1.0 [3/3] [INFO] --------------------------------[ jar ]--------------------------------- ... [INFO] ------------------------------------------------------------------------ [INFO] Reactor Summary for maven-parent 1.0: [INFO] [INFO] maven-parent ....................................... SUCCESS [ 0.520 s] [INFO] maven-example1 ..................................... SUCCESS [ 0.961 s] [INFO] maven-example2 ..................................... SUCCESS [ 0.055 s] [INFO] ------------------------------------------------------------------------ [INFO] BUILD SUCCESS [INFO] ------------------------------------------------------------------------ [INFO] Total time: 1.713 s [INFO] Finished at: 2020-01-18T09:25:37+07:00 [INFO] ------------------------------------------------------------------------ |
Rất tiện phải không các bạn?