为什么需要统一的父pom
由于在项目中存在不同的模块,而模块间很可能引用一些共同的jar包,会很容易导致版本冲突。因此,需要一个统一的pom文件来作为父文件管理所有的依赖版本。
如何在Spring Boot中使用这样的pom文件
将项目从逻辑上划分为父项目和各模块,然后在各自的pom文件中配置其管理关系。
Step1: 父项目中的pom配置
- 首先必然是需要建立一个父项目,同时在其pom文件中将打包方式修改为pom:
<package>pom</package>
。 - 添加spring boot的build方式。
<build>
<finalName>parentboot</finalName>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<source>${java.version}</source>
<target>${java.version}</target>
<encoding>${project.build.sourceEncoding}</encoding>
</configuration>
</plugin>
</plugins>
</build>
spring-boot-maven-plugin和maven-compiler-plugin的区别
前者直接将spring-boot程序打成可执行的jar包了,拿出来就直接通过命令行启动内置的tomcat,进而带动应用的启动。后者只是单纯的打包。
- 将其依赖方式等,修改为<dependencyManagement>的方式,同时在里面添加所有的Spring Boot的总依赖
spring-boot-dependencies
。
<dependencyManagement>
<dependencies>
<dependency>
<!-- Import dependency management from Spring Boot -->
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-dependencies</artifactId>
<version>2.0.0.BUILD-SNAPSHOT</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
- 如果想单独升级某个模块,而不依赖于
spring-boot-dependencies
的话,可以直接将该模块的依赖写在dependency之前,并且scope为import
,类型为pom
。
<dependencyManagement>
<dependencies>
<!-- Override Spring Data release train provided by Spring Boot -->
<dependency>
<groupId>org.springframework.data</groupId>
<artifactId>spring-data-releasetrain</artifactId>
<version>Fowler-SR2</version>
<scope>import</scope>
<type>pom</type>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-dependencies</artifactId>
<version>2.0.0.BUILD-SNAPSHOT</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
Step2: 创建子模块
- 直接使用spring的start建立一个子模块即可。
- 删除子模块pom文件的相关配置,追加spring boot web依赖包。
注意
此时会出现junit冲突的报错。因为Spring Boot在父项目中引入的依赖包是很全的,锁定了程序中很多依赖的版本。此时直接从子项目中删除其junit依赖即可。
Step3: 一些其他的注意点
- 使用start生成的spring boot子项目,其pom文件中的<parent>标签需要修改为现在的父项目。这个不要忘了。
- 同样的,不要忘记在父项目中,通过module标签引入子模块。