Maven的好处
Maven 的好处就是统一管理jar 包,它充当一个缓存的角色,当程序需要某些包时,会先从本地仓库获取,找不到时再自动去网上远程仓库下载,下载完之后缓存中也会存一份,以备将来使用。
Maven管理多模块项目
当业务变得越来越复杂,代码越来越多时,就会遇到很多的问题:
-
不同业务之间的代码出现耦合,难以定位问题,难以追踪具体的负责人。
-
开发者很容易修改到他人负责的代码,而相关的代码负责人还不知情。另外新员工入手也很难。
故而拆分模块,避免上述问题。通常有 2 种拆分方案:
1. 按照MVC架构拆分
- mall
- module-service
- module-controller
- module-dao
- module-utils
2. 按照业务功能拆分(常用)
- mall
- module-common
- module-order
- module-account
- module-pay
拆分之后需要注意依赖冲突和版本控制的问题。
- 对于依赖冲突,可以借助 Maven Helper 插件生成依赖关系图来检查
- 对于版本控制,共同拥有的依赖的版本号只在主pom中声明一份,子模块自动继承。如果某个子模块有独立的依赖,就独立添加版本号
创建多模块项目的流程
1、创建主项目。
new → Project,出现如下页面。
左侧选中Maven,确定java版本后下面不打任何勾,直接点击next,出现如下页面。
Name就是整个项目的名字,同样作为ArtifactId,填写后点击Finish,进入项目主页,删除src目录。主项目中便只有.idea和主pom.xml文件。
2、创建子模块。
主项目上右键 → new → Module,出现再次如下页面。
左侧选中Maven,确定java版本后下面不打任何勾,直接点击next,出现如下页面。
可以在Parent中看到子模块自动继承了主项目,自己需要填写一个子模块的Name,作为子模块的ArtifactId,然后点击Finish,完成一个子模块的创建。连续创建多个,可得到最终的多模块项目结构。
多个pom.xml文件的基本写法
主pom.xml文件的样子
<?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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<parent> <!-- 自己添加,主pom.xml的parent一般需要指向springboot-starter -->
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.2.6.RELEASE</version>
</parent>
<modelVersion>4.0.0</modelVersion> <!-- 自动生成 -->
<groupId>com.hsy</groupId> <!-- 建主项目时填的,建完自动生成 -->
<artifactId>my-demo</artifactId> <!-- 建主项目时填的,建完自动生成 -->
<version>0.0.1-SNAPSHOT</version> <!-- 建主项目时选择的,建完自动生成 -->
<packaging>pom</packaging> <!-- 自动生成的。主pom.xml的此处必须填写pom,因为使用了聚合模型 -->
<properties> <!-- 建主项目时选择的java版本,建完自动生成 -->
<java.version>8</java.version>
<maven.compiler.source>8</maven.compiler.source>
<maven.compiler.target>8</maven.compiler.target>
</properties>
<!-- 在主项目上建完子项目后自动在这里追加,值就是子项目的artifactId,需要自己定义 -->
<modules>
<module>module-a</module>
<module>module-b</module>
<module>module-c</module>
</modules>
<!-- 自己添加。主pom.xml中需要加一层dependencyManagement -->
<dependencyManagement>
<dependencies>
...(每一项都需要指定version)
</dependencies>
</dependencyManagement>
<build>
<plugins>
<!-- 注意此处为空 -->
</plugins>
</build>
</project>
如果子模块a依赖b,那子模块a的pom.xml写法如下
<?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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<parent> <!-- 建完子项目后自动生成,自动继承了父pom.xml -->
<artifactId>my-demo</artifactId>
<groupId>com.hsy</groupId>
<version>0.0.1-SNAPSHOT</version>
<relativePath>../pom.xml</relativePath> <!-- 可省略 -->
</parent>
<modelVersion>4.0.0</modelVersion> <!-- 自动生成 -->
<artifactId>module-a</artifactId> <!-- 建子项目时填的,建完自动生成 -->
<packaging>jar</packaging> <!-- 自己添加,子pom.xml的此处需要填写为jar -->
<name>module-a</name> <!-- 可省略 -->
<!-- 子pom.xml中不需要dependencyManagement层 -->
<dependencies>
<dependency> <!-- module-a依赖于module-b -->
<groupId>com.hsy</groupId>
<artifactId>module-b</artifactId>
</dependency>
</dependencies>
</project>
如果子模块b无依赖,且是启动类,则它的pom.xml写法如下
<?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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<parent> <!-- 建完子项目后自动生成,自动继承了父pom.xml -->
<artifactId>my-demo</artifactId>
<groupId>com.hsy</groupId>
<version>0.0.1-SNAPSHOT</version>
<relativePath>../pom.xml</relativePath> <!-- 可省略 -->
</parent>
<modelVersion>4.0.0</modelVersion> <!-- 自动生成 -->
<artifactId>module-b</artifactId> <!-- 建子项目时填的,建完自动生成 -->
<packaging>jar</packaging> <!-- 自己添加,子pom.xml的此处需要填写为jar -->
<name>module-b</name> <!-- 可省略 -->
<!--添加启动需要的依赖。-->
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
<version>2.2.6.RELEASE</version> <!-- 如果某个依赖只在当前pom.xml中有,就需要在此地指定版本号-->
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<version>2.2.6.RELEASE</version>
</dependency>
</dependencies>
<build>
<plugins>
<!--因为启动类在这个pom.xml中,所以此处必须添加该plugin-->
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>