这次做新项目,是基于老项目的架构开发,正好可以将以前不合理的地方修正过来。今天优化的是jar包版本管理混乱的问题。
原有架构中,mavan的jar包导入十分混乱,主要体现在以下几点:
1、springboot版本1.x和2.x并行,导致某些公共包需要开发两个版本,增加了开发和维护成本
2、json包没有统一,有的是jsonlib包,有的是fastjson,版本也不一致
3、公共包不能做到强制升级,开发人员不愿意使用公共包的函数,拒绝使用新版本,工具函数重复造轮子
为了解决以上问题,我在新建了一个项目,里面只有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>xxx</groupId>
<artifactId>base</artifactId>
<packaging>pom</packaging>
<version>0.0.1</version>
<name>base</name>
<properties>
<springframework.version>4.3.12.RELEASE</springframework.version>
<springboot.version>1.5.9.RELEASE</springboot.version>
<guava.version>26.0-jre</guava.version>
</properties>
<dependencyManagement>
<dependencies>
<!-- 统一管理Spring依赖 -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-framework-bom</artifactId>
<version>${springframework.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<!--通过Spring Boot管理其他第三方版本-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-dependencies</artifactId>
<version>${springboot.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<!--其他-->
<dependency>
<groupId>com.google.guava</groupId>
<artifactId>guava</artifactId>
<version>${guava.version}</version>
</dependency>
</dependencies>
</dependencyManagement>
</project>
这里有几个地方需要注意:
1、<packaging>pom</packaging>:这里要设置为pom,最后会打包成.pom的文件,而不是jar包
2、<properties>:所有的版本都定义在这里,集中管理
3、<dependencyManagement>:声明导入,而不是真的导入,这样子项目就可以按需索取
4、当然还可以配置公共插件,比如maven-compiler-plugin等
配置好之后,运行mvn clean install 可将其发布到本地仓库,mvn clean package 不会在target文件生成任何制品。
子项目中的引入就比较简单了,直接设置parent为base:
<parent>
<groupId>xxx</groupId>
<artifactId>base</artifactId>
<version>0.0.1</version>
<relativePath>../pom.xml</relativePath> <!--此处在我的项目中用不上-->
</parent>
引入依赖:
<dependencies>
<dependency>
<groupId>com.google.guava</groupId>
<artifactId>guava</artifactId>
</dependency>
</dependencies>
如果子项目中定义了版本号,则会覆盖parent中的版本号,如果不定义,则使用parent中的版本号。我们的项目中默认使用parent的版本号