idea创建maven多模块

159 阅读4分钟

创建父项目

#创建maven项目,选择maven-archetype-site模板
#修改父项目打包方式:<packaging>pom</packaging>

创建独立提供服务api模块

#New Module,不勾选模板,不依赖父项目即parent选择<none>
原因是api模块是要提供jar依赖给别人使用,如果依赖了父项目,那么父项目也要推送到仓库供别人拉取,这样不规范
#推送github供下载

创建子模块

#New Module,不勾选模板,依赖父项目:common、mapper、service、web、schedule、mq等子模块

项目结构

test-parent
​ |-test-api --> dubbo api模块,给别人依赖,提供服务
​ |-test-common --> 通用模块
​ |-test-mapper --> 数据库模块,放数据库实体和mapper
​ |-test-service --> 服务的具体实现,包含dubbo服务和业务服务。通常作为一个应用
​ |-test-web --> web模块,提供http能力,通常作为一个应用
​ |-test-schedule --> job模块,通常用于补偿、定时操作等,通常作为一个应用

父项目添加依赖

#添加spring-boot-starter-parent
<parent>
	<groupId>org.springframework.boot</groupId>
	<artifactId>spring-boot-starter-parent</artifactId>
	<version>2.7.5</version>
	<relativePath/> <!-- lookup parent from repository -->
</parent>
#添加properties,用于控制依赖的版本
<properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
    <java.version>1.8</java.version>
    <skipTests>true</skipTests>
    <!--<docker.host>http://192.168.3.101:2375</docker.host>
        <docker.maven.plugin.version>1.1.0</docker.maven.plugin.version>-->
    <pagehelper-starter.version>1.2.10</pagehelper-starter.version>
    <pagehelper.version>5.1.8</pagehelper.version>
    <druid.version>1.1.10</druid.version>
    <hutool.version>4.5.7</hutool.version>
    <swagger2.version>2.9.2</swagger2.version>
    <swagger-models.version>1.6.0</swagger-models.version>
    <swagger-annotations.version>1.6.0</swagger-annotations.version>
    <mybatis-generator.version>1.3.7</mybatis-generator.version>
    <mybatis.version>3.4.6</mybatis.version>
    <mysql-connector.version>8.0.16</mysql-connector.version>
    <spring-data-commons.version>2.1.5.RELEASE</spring-data-commons.version>
    <hulk-common.version>1.0-SNAPSHOT</hulk-common.version>
    <hulk-mapper.version>1.0-SNAPSHOT</hulk-mapper.version>
</properties>
#添加dependencyManagement
<dependencyManagement>
	<dependencies>
		<!--通用模块-->
		<dependency>
			<groupId>org.example</groupId>
			<artifactId>test-common</artifactId>
			<version>${test-common.version}</version>
		</dependency>
		<!--MBG生成模块-->
		<dependency>
			<groupId>org.example</groupId>
			<artifactId>test-mapper</artifactId>
			<version>${test-mapper.version}</version>
		</dependency>


		<!--MyBatis分页插件starter-->
		<dependency>
			<groupId>com.github.pagehelper</groupId>
			<artifactId>pagehelper-spring-boot-starter</artifactId>
			<version>${pagehelper-starter.version}</version>
		</dependency>
		<!--MyBatis分页插件-->
		<dependency>
			<groupId>com.github.pagehelper</groupId>
			<artifactId>pagehelper</artifactId>
			<version>${pagehelper.version}</version>
		</dependency>
		<!--集成druid连接池-->
		<dependency>
			<groupId>com.alibaba</groupId>
			<artifactId>druid-spring-boot-starter</artifactId>
			<version>${druid.version}</version>
		</dependency>
		<!--Hutool Java工具包-->
		<dependency>
			<groupId>cn.hutool</groupId>
			<artifactId>hutool-all</artifactId>
			<version>${hutool.version}</version>
		</dependency>
		<!--Swagger-UI API文档生产工具-->
		<dependency>
			<groupId>io.springfox</groupId>
			<artifactId>springfox-swagger2</artifactId>
			<version>${swagger2.version}</version>
		</dependency>
		<dependency>
			<groupId>io.springfox</groupId>
			<artifactId>springfox-swagger-ui</artifactId>
			<version>${swagger2.version}</version>
		</dependency>
		<!--解决Swagger 2.9.2版本NumberFormatException-->
		<dependency>
			<groupId>io.swagger</groupId>
			<artifactId>swagger-models</artifactId>
			<version>${swagger-models.version}</version>
		</dependency>
		<dependency>
			<groupId>io.swagger</groupId>
			<artifactId>swagger-annotations</artifactId>
			<version>${swagger-annotations.version}</version>
		</dependency>
		<!-- MyBatis 生成器 -->
		<dependency>
			<groupId>org.mybatis.generator</groupId>
			<artifactId>mybatis-generator-core</artifactId>
			<version>${mybatis-generator.version}</version>
		</dependency>
		<!-- MyBatis-->
		<dependency>
			<groupId>org.mybatis</groupId>
			<artifactId>mybatis</artifactId>
			<version>${mybatis.version}</version>
		</dependency>
		<!--Mysql数据库驱动-->
		<dependency>
			<groupId>mysql</groupId>
			<artifactId>mysql-connector-java</artifactId>
			<version>${mysql-connector.version}</version>
		</dependency>
		<!--SpringData工具包-->
		<dependency>
			<groupId>org.springframework.data</groupId>
			<artifactId>spring-data-commons</artifactId>
			<version>${spring-data-commons.version}</version>
		</dependency>
		<!--JWT(Json Web Token)登录支持-->
		<dependency>
			<groupId>io.jsonwebtoken</groupId>
			<artifactId>jjwt</artifactId>
			<version>${jjwt.version}</version>
		</dependency>
		<!--统一Guava版本防止冲突-->
		<dependency>
			<groupId>com.google.guava</groupId>
			<artifactId>guava</artifactId>
			<version>${guava.version}</version>
		</dependency>
	</dependencies>
</dependencyManagement>
注:父pom通常不加dependencies,如果要加,也只是加每个子模块都需要的dependencies。

dependencyManagement vs dependencies区别说明

#dependencyManagement应用场景
统一管理项目的版本号,确保应用的各个项目的依赖和版本一致,才能保证测试的和发布的是相同的成果,因此,在顶层pom中定义共同的依赖关系。
同时可以避免在每个使用的子项目中都声明一个版本号,这样想升级或者切换到另一个版本时,只需要在父类容器里更新,不需要任何一个子项目的修改;
如果某个子项目需要另外一个版本号时,只需要在dependencies中声明一个版本号即可。子类就会使用子类声明的版本号,不继承于父类版本号。
#dependencies应用场景
相对于dependencyManagement,如果在父pom文件中中通过dependencies引入jar,将默认被所有的子模块继承。

dependencyManagement里只是声明依赖,并不实现引入,因此子项目需要显式的声明需要用的依赖。如果不在子项目中声明依赖,是不会从父项目中继承下来的;
只有在子项目中写了该依赖项,并且没有指定具体版本,才会从父项目中继承该项,并且version和scope都读取自父pom;
另外如果子项目中指定了版本号,那么会使用子项目中指定的jar版本。
dependencies即使在子模块中不写该依赖项,那么子模块仍然会从父项目中继承该依赖项(全部继承)。
在实际的项目开发中,推荐在父pom中使用dependencyManagement对项目中使用到的依赖包进行统一的管理。

子模块添加依赖

#commmon模块
<dependencies>
	<dependency>
		<groupId>io.springfox</groupId>
		<artifactId>springfox-swagger2</artifactId>
	</dependency>
	<dependency>
		<groupId>io.springfox</groupId>
		<artifactId>springfox-swagger-ui</artifactId>
	</dependency>
	<dependency>
		<groupId>org.springframework.data</groupId>
		<artifactId>spring-data-commons</artifactId>
	</dependency>
	<dependency>
		<groupId>cn.hutool</groupId>
		<artifactId>hutool-all</artifactId>
	</dependency>
	<dependency>
		<groupId>org.projectlombok</groupId>
		<artifactId>lombok</artifactId>
	</dependency>
</dependencies>
#mapper模块
<dependencies>
	<dependency>
		<groupId>org.example</groupId>
		<artifactId>test-common</artifactId>
	</dependency>

	<dependency>
		<groupId>org.mybatis.generator</groupId>
		<artifactId>mybatis-generator-core</artifactId>
	</dependency>
	<dependency>
		<groupId>mysql</groupId>
		<artifactId>mysql-connector-java</artifactId>
	</dependency>
</dependencies>
#service模块
<dependencies>
	<dependency>
		<groupId>org.example</groupId>
		<artifactId>test-mapper</artifactId>
	</dependency>
	<dependency>
		<groupId>org.example</groupId>
		<artifactId>test-common</artifactId>
	</dependency>

	<dependency>
		<groupId>com.alibaba.boot</groupId>
		<artifactId>dubbo-spring-boot-starter</artifactId>
		<version>0.2.1.RELEASE</version>
	</dependency>
	<dependency>
		<groupId>com.ctrip.framework.apollo</groupId>
		<artifactId>apollo-client</artifactId>
		<version>1.7.0</version>
	</dependency>
</dependencies>
<!--打包需要-->
<build>
	<plugins>
		<plugin>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-maven-plugin</artifactId>
		</plugin>
	</plugins>
</build>
#web模块
<dependencies>
	<dependency>
		<groupId>org.example</groupId>
		<artifactId>test-mapper</artifactId>
	</dependency>
	<dependency>
		<groupId>org.example</groupId>
		<artifactId>test-common</artifactId>
	</dependency>
	<dependency>
		<groupId>org.springframework.boot</groupId>
		<artifactId>spring-boot-autoconfigure</artifactId>
	</dependency>
</dependencies>

maven的特点

继承
理解为 java 中的继承类似, 父类定义的东西, 子类如果你想用就拿过来用就可以。
依赖
依赖就相当于我们 java 中的导包, 二者有着异曲同工之妙;
你想用的东西只需要告诉 maven 它在哪就可以, 它会自动帮你找过来给你用。
聚合
这个暂时我还没找到 java 中能与之对应的原型;
maven 聚合是将多个模块组装在一起, 相互协调依赖运行。

总结

1.父项目的创建
方式:
	直接创建一个空项目,然后添加子模块
	直接创建maven,选一个模板,然后删掉src
	直接创建spring initializr,删掉src以及其他无用的
2.子模块的创建
	可以直接进入Project Structure的modules添加,也可以在file菜单添加
	可以在file中添加maven,不选模板,依赖父项目
	同上
3.修改父项目pom
	修改工程打包方式:<packaging>pom</packaging>
	添加properties,用于控制依赖的版本
	添加dependencyManagement :只是申明,具体使用子模块中引用,无需版本好
	添加spring-boot-starter-parent
	添加dependencies 若父项目添加了,子模块全部继承
3.父项目的依赖关系
	添加子模块依赖
4.子项目的依赖关系
	子模块之间添加依赖关系

作为启动服务模块需添加build
若提供别人依赖,提供服务的子模块不依赖于父项目,需推送远程服务供下载
同时需要打包,要增加spring-boot-maven-plugin插件