在使用Maven包管理进行工程开发的时候,经常会遇到jar包版本难统一,有冲突难排查的情况。
尤其是子模块比较多的时候,模块间的jar包版本统一问题显得尤其重要。
所以在这里推荐一种个人认为最佳实践的方法。
如上图,这个项目有一个子模块,需要两个pom文件,一个父pom,一个子pom。
父pom的主要功能:1 定义项目的一些基本属性; 2 整个项目所引用的jar包的版本管理。
子pom的主要功能:1 定义自己所依赖的模块;2 定义自己模块儿下面需要使用的jar包
看下面的父pom配置:
<?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 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.wlh</groupId>
<artifactId>wlh-root</artifactId>
<packaging>pom</packaging>
<version>1.0-SNAPSHOT</version>
<modules>
<module>mvn-tbbpm</module>
</modules>
<!--全局依赖的jar包-->
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
</dependency>
******
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
</dependency>
</dependencies>
<!--依赖版本管理-->
<dependencyManagement>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.11</version>
<scope>test</scope>
</dependency>
<!-- 日志相关的依赖 -->
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>1.7.12</version>
</dependency>
*****
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.8</version>
</dependency>
</dependencies>
</dependencyManagement>
</project>
使用dependencies标签定义整个项目中都需要用到的jar包(junit和fastjson)
使用dependencyManagement标签管理整个项目中jar包的版本,这里不仅定义了junit, fastjson的版本,还定义了slf4j-api的版本。
经过了上面的配置以后,子pom就不需要关心所依赖的版本,那些通用的依赖也不需要再单独配置,简单明了。
<?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 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<parent>
<artifactId>wlh-root</artifactId>
<groupId>com.wlh</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>mvn-tbbpm</artifactId>
<dependencies>
<!-- 日志相关的依赖 -->
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
</dependency>
</dependencies>
</project>
子pom只需要关心自己模块儿需要依赖的jar包就可以,版本管理可以交由父pom来控制。
这么做第一能够是配置高度统一,出了问题也好定位。
第二能够使版本管理变得简单有序。
第三,最重要的就是方便排包,如果出现包冲突,通过这个方法能够更好的定位并解决冲突。
具体排包可以参考另一篇博客:Maven解决包冲突 https://my.oschina.net/u/3755458/blog/1649938