创建父项目
#创建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插件