maven多模块项目jar包依赖版本统一管理最佳实践
-
- [1. 问题描述](#1. 问题描述)
- [2. 解决方案](#2. 解决方案)
-
- [2.1 父 pom配置](#2.1 父 pom配置)
- [2.2 模块中pom文件配置](#2.2 模块中pom文件配置)
- [3. 总结](#3. 总结)
1. 问题描述
现有一个基于Java8构建的供应链管理springboot项目,项目的目录结构如下:
- scm-parent(父工程)
- scm-web(模块)
- scm-service(模块)
- scm-domain(模块)
实现maven jar包依赖的统一版本管理。
2. 解决方案
1)version 只允许出现在一个地方(父 pom 的 )
2)子模块 dependency里不准写 (除非是本级模块互相引用)
2.1 父 pom配置
pom.xml文件只是一个示例,大家重点关注dependencyManagement, properties中定义的版本号变量即可。
xml
<?xml version="1.0" encoding="UTF-8"?>
<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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<name>scm-parent</name>
<groupId>com.xx</groupId>
<artifactId>scm-parent</artifactId>
<version>0.0.1</version>
<packaging>pom</packaging>
<properties>
<java.version>1.8</java.version>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<project.scm.version>0.0.1</project.scm.version>
<serverframe.version>1.0.1-SNAPSHOT</serverframe.version>
<!-- 第三方依赖版本 -->
<lombok.version>1.18.22</lombok.version>
<mybatis.version>3.5.19</mybatis.version>
<mybatis-plus.version>3.5.12</mybatis-plus.version>
<mybatis-plus-generator.version>3.5.0</mybatis-plus-generator.version>
<docx4j.version>3.2.1</docx4j.version>
<shiro.version>1.7.1</shiro.version>
...
</properties>
<modules>
<module>scm-domain</module>
<module>scm-service</module>
<module>scm-web</module>
</modules>
<dependencies>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency>
<dependency>
<groupId>...</groupId>
<artifactId>...</artifactId>
</dependency>
</dependencies>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>${lombok.version}</version>
</dependency>
<dependency>
<groupId>org.apache.shiro</groupId>
<artifactId>shiro-spring</artifactId>
<version>${shiro.version}</version>
</dependency>
</dependencies>
</dependencyManagement>
</project>
2.2 模块中pom文件配置
模块中pom文件只定位maven坐标,不能带版本号
xml
<?xml version="1.0" encoding="UTF-8"?>
<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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<name>scm-service</name>
<artifactId>scm-service</artifactId>
<version>${project.scm.version}</version>
<packaging>jar</packaging>
<parent>
<groupId>com.lehui.lhscm</groupId>
<artifactId>scm-parent</artifactId>
<version>0.0.1</version>
</parent>
<dependencies>
<!-- word模板引擎 -->
<dependency>
<groupId>org.freemarker</groupId>
<artifactId>freemarker</artifactId>
</dependency>
<dependency>
<groupId>...</groupId>
<artifactId>...</artifactId>
</dependency>
</dependencies>
</project>
3. 总结
dependencyManagement 本身不引入依赖,只是"版本声明":
- dependencyManagement:只有子模块声明了对应的maven坐标才引入指定版本的maven依赖,不声明不引入。