Spring Boot构建多模块项目

maven多模块项目通常由一个父模块和若干个子模块构成,每个模块都对应着一个pom.xml。它们之间通过继承和聚合(也称作多模块)相互关联。多模块适用于一些比较大的项目,通过合理的模块拆分,实现代码的复用,便于维护和管理。

1 多模块项目创建
1.1 父模块创建
首先我们在IDEA中创建一个spring boot工程作为父项目。

一、在界面左上角选择File->New->Project后,选择Spring Initializr,默认使用的Java版本是1.8。

二、点击Next,进入下一步,可以设置项目的一些基本信息。

三、点击Next,进入下一个选择dependency的界面,作用是在pom中自动添加一些依赖,在项目开始时就下载。这里我们暂时不勾选任何依赖。

四、点击Next,进入下一个界面,填写工程名,并选择工程所在目录。填写完成后,点击Finish,即可创建一个spring boot项目。

1.2 创建子模块
在上面创建好的工程名上,点击右键,选择New–>Module,进入New Module页面。

Spring Boot构建多模块项目

2 多模块项目配置
2.1 父模块pom配置
父pom是为了抽取统一的配置信息和依赖版本控制,方便子pom直接引用,简化子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.uwo</groupId>
	<artifactId>uwo-parent</artifactId>
	<version>0.0.1-SNAPSHOT</version>
	<packaging>pom</packaging>

	<name>uwo-parent</name>
	<description>Demo project for Spring Boot</description>

	<modules>
		<module>uwo-pojo</module>
		<module>uwo-common</module>
		<module>uwo-dao</module>
		<module>uwo-service</module>
		<module>uwo-manage</module>
	</modules>
	<parent>
		<groupId>org.springframework.boot</groupId>
		<artifactId>spring-boot-starter-parent</artifactId>
		<version>2.1.1.RELEASE</version>
		<relativePath/> <!-- lookup parent from repository -->
	</parent>

	<properties>
		<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
		<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
		<java.version>1.8</java.version>
	</properties>

	<!-- 只定义依赖的版本,并不实际依赖 -->
	<dependencyManagement>
		<dependencies>
			<!--spring-web-->
			<dependency>
				<groupId>org.springframework.boot</groupId>
				<artifactId>spring-boot-starter-web</artifactId>
				<version>2.1.1.RELEASE</version>
			</dependency>

			<!--test-->
			<dependency>
				<groupId>org.springframework.boot</groupId>
				<artifactId>spring-boot-starter-test</artifactId>
				<version>2.1.1.RELEASE</version>
				<scope>test</scope>
			</dependency>

			<!--redis-->
			<dependency>
				<groupId>org.springframework.boot</groupId>
				<artifactId>spring-boot-starter-data-redis</artifactId>
				<version>2.1.1.RELEASE</version>
			</dependency>

			<!--mybatis-->
			<dependency>
				<groupId>org.mybatis.spring.boot</groupId>
				<artifactId>mybatis-spring-boot-starter</artifactId>
				<version>1.3.2</version>
			</dependency>

			<!--MySQL-->
			<dependency>
				<groupId>mysql</groupId>
				<artifactId>mysql-connector-java</artifactId>
				<version>8.0.13</version>
				<scope>runtime</scope>
			</dependency>

			<!--通用mapper-->
			<dependency>
				<groupId>tk.mybatis</groupId>
				<artifactId>mapper-spring-boot-starter</artifactId>
				<version>2.0.4</version>
			</dependency>
			<!--分页插件-->
			<dependency>
				<groupId>com.github.pagehelper</groupId>
				<artifactId>pagehelper-spring-boot-starter</artifactId>
				<version>1.2.10</version>
			</dependency>
			<!--fastjson-->
			<dependency>
				<groupId>com.alibaba</groupId>
				<artifactId>fastjson</artifactId>
				<version>1.2.46</version>
			</dependency>
		</dependencies>
	</dependencyManagement>
	</project>

1、父模块的打包类型
多模块项目中,父模块打包类型必须是pom,同时以给出所有的子模块,其中每个module,都是另外一个maven项目。

后续新增的子模块也必须加到父pom的modules中。

2、继承设置
继承是maven中很强大的一种功能,继承可以使子pom获得parent中的各项配置,对子pom进行统一的配置和依赖管理。父pom中的大多数元素都能被子pom继承,想深入了解的同学可自行搜索学习~~

maven项目之间的继承关系通过表示。这里使用的开发框架是spring boot,默认继承spring-boot-starter-parent。

3、使用dependencyManagement管理依赖版本号
一般在项目最顶层的父pom中使用该元素,让所有子模块引用一个依赖而不用显式的列出版本号。maven会沿着父子层次向上走,直到找到一个拥有dependencyManagement元素的项目,然后它就会使用在这个dependencyManagement元素中指定的版本号。

4、使用properties控制依赖包的版本号,便于版本维护
在properties标签中,添加各依赖包的版本号,然后在dependency中直接引用该依赖版本号的值即可。我这没有演示,比较懒。

2.2 子模块pom配置
1、继承设置
子模块的parent要使用顶层的父模块.

2、依赖设置
父模块pom中使用dependencyManagement来管理的依赖,在子模块pom中就不需要再写版本号了,exclusion元素也不需要再写。
下面是service的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.uwo</groupId>
	<artifactId>uwo-service</artifactId>
	<version>0.0.1-SNAPSHOT</version>
	<packaging>jar</packaging>

	<name>uwo-service</name>
	<description>Demo project for Spring Boot</description>

	<parent>
		<groupId>com.uwo</groupId>
		<artifactId>uwo-parent</artifactId>
		<version>0.0.1-SNAPSHOT</version>
	</parent>

	<properties>
		<!--<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>-->
		<!--<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>-->
		<!--<java.version>1.8</java.version>-->
	</properties>

	<dependencies>

		<dependency>
			<groupId>com.uwo</groupId>
			<artifactId>uwo-dao</artifactId>
			<version>0.0.1-SNAPSHOT</version>
		</dependency>
		<dependency>
			<groupId>com.uwo</groupId>
			<artifactId>uwo-pojo</artifactId>
			<version>0.0.1</version>
		</dependency>
		<!--fastjson-->
		<dependency>
			<groupId>com.alibaba</groupId>
			<artifactId>fastjson</artifactId>
		</dependency>
		<!--test-->
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-test</artifactId>
			<scope>test</scope>
		</dependency>
	</dependencies>

	<build>
		<plugins>
			<!--<plugin>
				<groupId>org.springframework.boot</groupId>
				<artifactId>spring-boot-maven-plugin</artifactId>
			</plugin>-->
		</plugins>
	</build>


</project>

  <!--client模块需要依赖server模块-->
  <dependency>
     <groupId>com.practice</groupId>
     <artifactId>springboot-dubbo-server</artifactId>
     <version>0.0.1-SNAPSHOT</version>
  </dependency>
org.springframework.boot spring-boot-maven-plugin

在下面是主项目managepom文件

<?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.uwo</groupId>
	<artifactId>uwo-manage</artifactId>
	<version>0.0.1-SNAPSHOT</version>
	<packaging>jar</packaging>

	<name>uwo-manage</name>
	<description>Demo project for Spring Boot</description>

	<parent>
		<groupId>com.uwo</groupId>
		<artifactId>uwo-parent</artifactId>
		<version>0.0.1-SNAPSHOT</version>
	</parent>

	<properties>
	<!--	<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
		<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
		<java.version>1.8</java.version>-->
	</properties>

	<dependencies>
		<dependency>
			<groupId>com.uwo</groupId>
			<artifactId>uwo-service</artifactId>
			<version>0.0.1-SNAPSHOT</version>
		</dependency>
		<dependency>
			<groupId>com.uwo</groupId>
			<artifactId>uwo-pojo</artifactId>
			<version>0.0.1</version>
		</dependency>
		<!--spring mvc-->
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-web</artifactId>
		</dependency>

		<!--test-->
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-test</artifactId>
			<scope>test</scope>
		</dependency>
		<!--分页插件-->
		<dependency>
			<groupId>com.github.pagehelper</groupId>
			<artifactId>pagehelper-spring-boot-starter</artifactId>
		</dependency>

	</dependencies>

	<build>
		<finalName>app</finalName>
		<plugins>
			<plugin>
				<groupId>org.springframework.boot</groupId>
				<artifactId>spring-boot-maven-plugin</artifactId>
			</plugin>
			
			<plugin>
				<groupId>com.spotify</groupId>
				<artifactId>docker-maven-plugin</artifactId>
				<version>0.4.13</version>
				<configuration>

					<imageName>47.96.96.64:5000/${project.artifactId}:${project.version}
					</imageName>
					<baseImage>jdk1.8</baseImage>
					<entryPoint>["java", "-jar", "/${project.build.finalName}.jar"]</entryPoint>
					<resources>
						<resource>
							<targetPath>/</targetPath>
							<directory>${project.build.directory}
							</directory>

							<include>${project.build.finalName}.jar</include>
						</resource>
					</resources>
					<dockerHost>http://47.96.96.64:2375</dockerHost>
				</configuration>
			</plugin>
		</plugins>
	</build>


</project>

3、关于exclusions标签
当dependency A自身的依赖B,与其他dependency存在冲突的时候(最常见的就是版本冲突),我们就需要把B排除掉,这时就需要使用exclusions元素。

那么我们怎么知道一个dependency自身包含哪些依赖呢?
1、通过mvn dependency:tree命令查看依赖树
2、使用IDEA或其他IDA查看依赖树

点击IDEA右侧的Maven Projects,在每个模块的Dependencies中即可查看每个dependency内部的依赖及版本号,从来识别哪些依赖需要被排除掉。

3.还有一点就是依赖项目中的application启动类要删掉,不知为啥,一开始没有删掉会报,包找不到的错误,删除就好了!!!

3 测试
这里就先不写代码了,到下一章再写。直接编译一下,如果编译成功,说明pom文件的配置没有什么大问题。

点开右侧Maven Projects,双击父模块Lifecycle中的package,进行代码编译

编译通过啦~~

Spring Boot构建多模块项目
到这里,Spring Boot多模块项目创建与配置就介绍完啦。

这样一个过程实践下来,再去看开发的代码结构,应该会轻松不少吧~~~