目录
- Maven
- 一、Maven介绍
- 1. 依赖管理
- 2. 项目构建
- 二、Maven安装和配置
- 1. Maven安装
- 2. Maven环境配置
- 3. Maven功能配置
- 4. IDEA配置本地Maven软件
- 三、基于IDEA创建Maven工程
- 1. 什么是POM
- 2. 概念梳理Maven工程的GAVP
- 3. Idea构建Maven Java SE工程
- 4.构建JavaWeb工程
- 5. Maven工程项目结构说明
- 四、基于IDEA进行Maven工程构建
- 1. 构建概念和构建过程
- 2. 命令方式项目构建
- 2.1 编译和清理
- 2.2 测试
- 2.3 报告
- 2.4 打包
- 2.4.1 jar包
- 2.4.2 war包
- 2.5 安装
- 2.6 通过坐标查找jar
- 3. 可视化方式项目构建
- 4. 构建插件、命令、生命周期命令之间关系
- 五、基于IDEA 进行Maven依赖管理
- 1. 依赖管理概念
- 2. Maven工程核心信息配置和解读(GAVP)
- 3. Maven工程依赖管理配置
- 4.maven仓库信息官网
- 4. 依赖范围
- 4.1 作用范围
- 5. Maven工程依赖下载失败错误解决(重点)
- 6. Maven工程Build构建配置
- 六、Maven依赖传递和依赖冲突
- 1. Maven依赖传递特性
- 2. Maven依赖冲突特性
- 3. 依赖继承说明
- 4. 打包补充
- 七、Maven工程继承和聚合关系
- 1. Maven工程继承关系
- 2. Maven工程聚合关系
- 八、Maven私服
- 1. Maven私服简介
- 2. Nexus下载安装
- 3. 初始设置
- 4. Nexus上的各种仓库
- 5. 通过 Nexus 下载 jar 包
- 6. 将 jar 包部署到 Nexus
- 7. 引用别人部署的 jar 包
- 九、Maven综合案例
- 1. 项目需求和结构分析
- 2. 项目搭建和统一构建
- ①父模块 (micro-shop)
- ②通用模块 (common-service)
- ③用户模块 (user-service)
- ④订单模块 (order-service)
Maven
一、Maven介绍
https://maven.apache.org/what-is-maven.html
Maven 是由 Apache 软件基金会开发Java 项目管理构建、依赖管理的工具(软件),使用 Maven 可以自动化构建、测试、打包和发布项目,大大提高了开发效率和质量。
Maven就是一个软件,掌握安装、配置、以及基本功能(项目构建、依赖管理)的理解和使用即可!
Maven主要得功能就是项目构建和依赖管理功能,下面介绍下两个功能:
1. 依赖管理
学习 Maven 的主要目的之一,就是利用它来高效管理项目依赖。例如,引入 Spring 框架时,往往需要同时添加多个相关的依赖包;如果不使用 Maven,我们就得手动下载并逐一配置这些 JAR 包。而通过 Maven,只需在 pom.xml 中声明 Spring 依赖,它便会自动下载所需的所有依赖项,并解决版本兼容问题,大大简化了开发流程。
场景:例如我们项目需要第三方依赖如:Druid连接池、MySQL数据库驱动和Jackson JSON等处理。那么我们可以将想要的依赖项的信息编写到Maven工程的配置文件,Maven就会自动下载并复制这些依赖项到项目中,无需自己导入jar包,管理jar!
2. 项目构建
项目构建是指将源代码、配置文件、资源文件等转化为能够运行或部署的应用程序或库的过程
Maven 可以管理项目的编译、测试、打包、部署等构建过程。通过实现标准的构建生命周期,Maven 可以确保每一个构建过程都遵循同样的规则和最佳实践。同时,Maven 的插件机制也使得开发者可以对构建过程进行扩展和定制。主动触发构建,只需要简单的命令操作即可。
场景:项目完成开发,我们想要打成war部署到服务器中,使用maven的构建命令可以快速打包!节省大量时间!再比如使用Jenkins去部署项目,也是要用Maven去打包项目
二、Maven安装和配置
1. Maven安装
https://maven.apache.org/docs/history.html
各个工具选用版本:
| 工具 | 版本 |
|---|---|
| Maven | 3.9.9 |
| JDK | 1.8 |
| IDEA | 2024.3 |
安装条件:maven需要本机安装java环境、必需包含java_home环境变量!
软件安装:右键解压即可(绿色免安装)
软件结构:
bin:含有Maven的运行脚本
boot:含有plexus-classworlds类加载器框架
conf:含有Maven的核心配置文件
lib:含有Maven运行时所需要的Java类库
LICENSE、NOTICE、README.txt:针对Maven版本,第三方软件等简要介绍
2. Maven环境配置
- 配置MAVEN_HOME
- 配置Path
- 命令测试(cmd窗口)
mvn -v# 输出版本信息即可,如果错误,请仔细检查环境变量即可!3. Maven功能配置
安装Maven之前要确保环境中已经安装好了JDK,并且必须要配置JAVA_HOME环境变量。
我们需要需改maven/conf/settings.xml配置文件,来修改maven的一些默认配置。我们主要休要修改的有三个配置:
1.依赖本地缓存位置(本地仓库位置)
2.maven下载镜像
- 配置本地仓库地址(存放远程拉取的jar包和自己构建的jar包)
<!-- localRepository | The path to the local repository maven will use to store artifacts. | | Default: ${user.home}/.m2/repository <localRepository>/path/to/local/repo</localRepository> --><localRepository>F:\04_javaSoftware\maven\repository</localRepository>- 配置国内阿里镜像(远程拉取jar的仓库)
<!--在mirrors节点(标签)下添加中央仓库镜像 160行附近--><mirror><!-- 指定镜像ID(可自己改名) --><id>nexus-aliyun</id><!-- 匹配中央仓库(阿里云的仓库名称,不可以自己起名,必须这么写)--><mirrorOf>central</mirrorOf><!-- 指定镜像名称(可自己改名) --><name>Nexus aliyun</name><!-- 指定镜像路径(镜像地址) --><url>http://maven.aliyun.com/nexus/content/groups/public</url></mirror>4. IDEA配置本地Maven软件
我们需要将配置好的maven软件,配置到idea开发工具中即可! 注意:idea工具默认自带maven配置软件,但是因为没有修改配置,建议替换成本地配置好的maven!
选择本地maven软件
User settings file:配置为刚才我们修改的settings.xml配置文件的位置
Local repository:设置为上边在settings.xml中设置的localRepository中的值
注意:
1、如果本地仓库地址不变化,只有一个原因,就是maven/conf/settings.xml配置文件编写错误!仔细检查即可!
2、一定保证User settings file对应之前修改的settings.xml的路径,若 不一致,选中Override复选框,手动选择配置文件
三、基于IDEA创建Maven工程
1. 什么是POM
可以理解为POM是Maven在Idea中的配置文件。POM(Project Object Model)项目对象模型,它是Maven的核心组件。它是Maven中的基本工作单元。它是一个xml文件,以pom.xml驻留在项目的根目录中。POM不仅包含有关项目的信息及Maven用于构建项目的各种配置的详细信息,还包含目标和插件。
pom.xml文件示例:
<?xml version="1.0" encoding="UTF-8"?><projectxmlns="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"><!-- 固定写法:POM 模型版本 --><modelVersion>4.0.0</modelVersion><!-- 项目坐标(唯一标识) --><groupId>com.example</groupId><!-- 组织名,通常用公司域名倒写 --><artifactId>my-app</artifactId><!-- 项目名 --><version>1.0.0</version><!-- 版本号 --><!-- 打包类型:jar(默认)、war、pom 等 --><packaging>jar</packaging><!-- 项目属性:定义可复用的变量 --><properties><maven.compiler.release>17</maven.compiler.release><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding></properties><!-- 依赖管理:列出项目需要的第三方库 --><dependencies><dependency><groupId>org.junit.jupiter</groupId><artifactId>junit-jupiter</artifactId><version>5.10.0</version><scope>test</scope></dependency></dependencies></project>2. 概念梳理Maven工程的GAVP
Maven工程相对之前的项目,多出一组gavp属性,gav需要我们在创建项目的时候指定,p有默认值,我们先行了解下这组属性的含义:
Maven 中的 GAVP 是指 GroupId、ArtifactId、Version、Packaging 等四个属性的缩写,其中前三个是必要的,而 Packaging 属性为可选项。这四个属性主要为每个项目在maven仓库中做一个标识,类似人的姓-名!有了具体标识,方便后期项目之间相互引用依赖等!
GAV遵循一下规则:
1) **GroupID 格式**:com.{公司/BU }.业务线.[子业务线],最多 4 级。 说明:{公司/BU} 例如:alibaba/taobao/tmall/aliexpress 等 BU 一级;子业务线可选。 正例:com.taobao.tddl 或 com.alibaba.sourcing.multilang 2) **ArtifactID 格式**:产品线名-模块名。语义不重复不遗漏,先到仓库中心去查证一下。 正例:tc-client / uic-api / tair-tool / bookstore 3) **Version版本号格式推荐**:主版本号.次版本号.修订号 1) 主版本号:当做了不兼容的 API 修改,或者增加了能改变产品方向的新功能。 2) 次版本号:当做了向下兼容的功能性新增(新增类、接口等)。 3) 修订号:修复 bug,没有修改方法签名的功能加强,保持 API 兼容性。 例如: 初始→1.0.0 修改bug → 1.0.1 功能调整 → 1.1.1等Packaging定义规则:
指示将项目打包为什么类型的文件,idea根据packaging值,识别maven项目类型! packaging 属性为 jar(默认值),代表普通的Java工程,打包以后是.jar结尾的文件。 packaging 属性为 war,代表Java的web工程,打包以后.war结尾的文件。 packaging 属性为 pom,代表不会打包,用来做继承的父工程。3. Idea构建Maven Java SE工程
注意:此处省略了version,直接给了一个默认值:1.0-SNAPSHOT
自己后期可以在项目中随意修改!
创建工程之后,若第一次使用maven,或者使用的是新的本地仓库,idea右下角会出现以下进度条,表示maven正在下载相关插件,等待下载完毕,进度条消失即可
创建的maven项目会有固定的项目结构,pom文件在根目录下
右侧会Maven 工具窗口(Maven 按钮)是一个非常实用的功能,它让你可视化地管理 Maven 项目
4.构建JavaWeb工程
- 手动创建
- 创建一个maven的javase工程
- 修改pom.xml文件打包方式修改位置:项目下/pom.xml然后刷新项目
- 创建一个maven的javase工程
<groupId>com.zhp</groupId><artifactId>maven_web</artifactId><version>1.0-SNAPSHOT</version><!-- 新增一列打包方式packaging --><packaging>war</packaging>3. 设置**web资源路径**和**web.xml路径**点击File-->Project Structure,选择maven_web 4. 刷新和校验5. Maven工程项目结构说明
Maven 是一个强大的构建工具,它提供一种标准化的项目结构,也就是说创建出来的项目目录结构的固定的,可以帮助开发者更容易地管理项目的依赖、构建、测试和发布等任务。以下是 Maven Web 程序的文件结构及每个文件的作用:
|-- pom.xml # Maven 项目管理文件 |-- src |-- main # 项目主要代码 | |-- java # Java 源代码目录 | | `-- com/example/myapp # 开发者代码主目录 | | |-- controller # 存放 Controller 层代码的目录 | | |-- service # 存放 Service 层代码的目录 | | |-- dao # 存放 DAO 层代码的目录 | | `-- model # 存放数据模型的目录 | |-- resources # 资源目录,存放配置文件、静态资源等 | | |-- log4j.properties # 日志配置文件 | | |-- spring-mybatis.xml # Spring Mybatis 配置文件 | | `-- static # 存放静态资源的目录 | | |-- css # 存放 CSS 文件的目录 | | |-- js # 存放 JavaScript 文件的目录 | | `-- images # 存放图片资源的目录 | `-- webapp # 存放 WEB 相关配置和资源 | |-- WEB-INF # 存放 WEB 应用配置文件 | | |-- web.xml # Web 应用的部署描述文件 | | `-- classes # 存放编译后的 class 文件 | `-- index.html # Web 应用入口页面 `-- test # 项目测试代码 |-- java # 单元测试目录 `-- resources # 测试资源目录- pom.xml:Maven 项目管理文件,用于描述项目的依赖和构建配置等信息。
- src/main/java:存放项目的 Java 源代码。
- src/main/resources:存放项目的资源文件,如配置文件、静态资源等。
- src/main/webapp/WEB-INF:存放 Web 应用的配置文件。
- src/main/webapp/index.jsp:Web 应用的入口页面。
- src/test/java:存放项目的测试代码。
- src/test/resources:存放测试相关的资源文件,如测试配置文件等。
四、基于IDEA进行Maven工程构建
1. 构建概念和构建过程
项目构建是指将源代码、依赖库和资源文件等转换成可执行或可部署的应用程序的过程,在这个过程中包括编译源代码、链接依赖库、打包和部署等多个步骤。
项目构建是软件开发过程中至关重要的一部分,它能够大大提高软件开发效率,使得开发人员能够更加专注于应用程序的开发和维护,而不必关心应用程序的构建细节。
同时,项目构建还能够将多个开发人员的代码汇合到一起,并能够自动化项目的构建和部署,大大降低了项目的出错风险和提高开发效率。常见的构建工具包括 Maven、Gradle、Ant 等。
2. 命令方式项目构建
| 命令 | 描述 |
|---|---|
| mvn compile | 编译项目,生成java字节码文件,生成target文件 |
| mvn package | 打包项目,生成jar或war文件 |
| mvn clean | 清理编译或打包后的项目结构,删除target目录 |
| mvn install | 打包后上传到maven本地仓库 |
| mvn deploy | 只打包,上传到maven私服仓库 |
| mvn site | 生成站点 |
| mvn test | 执行测试源码 |
2.1 编译和清理
- mvn compile 编译项目
mvn compile编译的是核心源码指的是
在项目的根目录下进入cmd窗口执行mvn compile
上边的编译过程可以发现mvn compile这个命令是通过complier:3.13.0这个插件去执行的,而maven中使用的插件其实也是一个jar包,看下面的maven仓库中可以发现这个complier:3.13.0也是以jar包存在我们本地仓库中
所以说可以理解为maven中的相关命令就是插件去执行的,而插件也是相关的jar包,也是可以从远程仓库拉取到本地的。
编译成功后会在本地生成target目录,目录下的classes文件下就存放了编译好的class文件
- mvn clean 清理编译的结果
在根目录下执行mvn clean,编译好的target目录就会被删除
2.2 测试
首先在pom文件中引入junit依赖
<dependencies><dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>4.13.2</version><scope>test</scope></dependency></dependencies>引入依赖之后刷新pom.xml文件,以后每次修改pom.xml文件都要手动的去刷新,它不会自动的加载
mvn test指的是执行测试源码,测试源码指的是如下目录下的代码
在test目录下创建的类名和类中方法命名必须遵命名规则,不然mvn test不会执行测试类中的方法:
- test目录下的测试方法名字必须以Test开头或结尾
- 类中的方法名必须以test开头
在test目录下创建一个MavenTest类
publicclassMavenTest{@TestpublicvoidtestHelloWorld(){System.out.println("Hello World");}}在根目录下执行mvn test
从上面可以看到测试的结果,并且test目录下的测试类被编译到了tatget目录下的test-classes目录下
2.3 报告
当执行了mvn test后会在tatget目录下的surefire-reports生成测试报告
2.4 打包
mvn package命令会把项目打包成jar或war文件。
具体是打包成jar或war文件是在pom.xml文件中通过packaging去配置,如果不设置默认就是打成jar包
2.4.1 jar包
在根目录下执行mvn package
在target目录下会生成以项目加版本为名字的jar包
2.4.2 war包
打war包需要把package设置为war。
在上边创建javaweb工程的maven_web修改pom.xml文件
<packaging>war</packaging>在根目录下执行mvn package。
target生成war包
2.5 安装
安装值的是将我们的项目打包后安装到本地仓库中
创建一个maven_install项目
创建一个User类
publicclassUser{privateStringname;privateintage;publicStringgetName(){returnname;}publicvoidsetName(Stringname){this.name=name;}publicintgetAge(){returnage;}publicvoidsetAge(intage){this.age=age;}}安装maven_install项目
安装成功后会安装到在maven设置的本地仓库中
2.6 通过坐标查找jar
上边安装到本地的maven_install项目成功安装到本地后其它项目就可以在pom.xml中设置坐标然后引入
在maven_java项目中引入maven_install的User类
刷新pom.xml文件
在maven_java中可以引用maven_install中的User类
3. 可视化方式项目构建
idea右侧maven的可视化命令和直接在项目根目录下执行mvn命令效果是一样的
注意:打包(package)和安装(install)的区别是什么
打包是将工程打成jar或war文件,保存在target目录下
安装是将当前工程所生成的jar或war文件,安装到本地仓库,会按照坐标保存到指定位置
4. 构建插件、命令、生命周期命令之间关系
- 构建生命周期我们发现一个情况!当我们执行package命令也会自动执行compile命令和testCompile命令!
[INFO] --------------------------------[ jar ]--------------------------------- [INFO] [INFO] --- resources:3.3.1:resources (default-resources) @ maven_java --- [INFO] Copying 0 resource from src\main\resources to target\classes [INFO] [INFO] --- compiler:3.13.0:compile (default-compile) @ maven_java --- [INFO] Recompiling the module because of changed source code. [INFO] Compiling 1 source file with javac [debug target 1.8] to target\classes [INFO] [INFO] --- resources:3.3.1:testResources (default-testResources) @ maven_java --- [INFO] skip non existing resourceDirectory F:\02_javaproject\maven_learn\maven_java\src\test\resources [INFO] [INFO] --- compiler:3.13.0:testCompile (default-testCompile) @ maven_java --- [INFO] Recompiling the module because of changed dependency. [INFO] Compiling 1 source file with javac [debug target 1.8] to target\test-classes [INFO] [INFO] --- surefire:3.2.5:test (default-test) @ maven_java --- [INFO] Using auto detected provider org.apache.maven.surefire.junit4.JUnit4Provider [INFO] [INFO] ------------------------------------------------------- [INFO] T E S T S [INFO] ------------------------------------------------------- [INFO] Running com.zhp.MavenTest Hello World [INFO] Tests run: 1, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.027 s -- in com.zhp.MavenTest [INFO] [INFO] Results: [INFO] [INFO] Tests run: 1, Failures: 0, Errors: 0, Skipped: 0 [INFO] [INFO] [INFO] --- jar:3.4.1:jar (default-jar) @ maven_java --- [INFO] Building jar: F:\02_javaproject\maven_learn\maven_java\target\maven_java-1.0-SNAPSHOT.jar [INFO] ------------------------------------------------------------------------ [INFO] BUILD SUCCESS [INFO] ------------------------------------------------------------------------ [INFO] Total time: 1.601 s [INFO] Finished at: 2025-12-07T13:26:16+08:00 [INFO] ------------------------------------------------------------------------从上边可以看到maven中有一些命令是包含其它命令的,一个命令可能是多个命令的集合。maven也可以一次执行多个命令比如**mvn clean package**,这个命令先执行clean:清理旧的构建产物,然后执行package:编译、测试并打包项目。Maven 的default 生命周期是线性的,顺序如下:
... → compile → test → package → install → deploy当你运行某个阶段时,Maven 会自动执行该阶段及之前的所有阶段,但不会执行之后的阶段
- **插件、命令、周期三者关系(了解)**周期→包含若干命令→包含若干插件使用周期命令构建,简化构建过程!最终进行构建的是插件!比如执行mvn package
package是生命周期的一个阶段- Maven 自动执行:
compile→test→package - 这些阶段背后分别绑定了:
maven-compiler-plugin:compilemaven-surefire-plugin:testmaven-war-plugin:war
- 真正干活的,是这些插件
五、基于IDEA 进行Maven依赖管理
1. 依赖管理概念
Maven 依赖管理是 Maven 软件中最重要的功能之一。Maven 的依赖管理能够帮助开发人员自动解决软件包依赖问题,使得开发人员能够轻松地将其他开发人员开发的模块或第三方框架集成到自己的应用程序或模块中,避免出现版本冲突和依赖缺失等问题。
我们通过定义 POM 文件,Maven 能够自动解析项目的依赖关系,并通过 Maven仓库自动下载和管理依赖,从而避免了手动下载和管理依赖的繁琐工作和可能引发的版本冲突问题。
总之,Maven 的依赖管理是 Maven 软件的一个核心功能之一,使得软件包依赖的管理和使用更加智能和方便,简化了开发过程中的工作,并提高了软件质量和可维护性。
2. Maven工程核心信息配置和解读(GAVP)
位置:pom.xml
<!-- 模型版本 --><modelVersion>4.0.0</modelVersion><!-- 公司或者组织的唯一标志,并且配置时生成的路径也是由此生成, 如com.companyname.project-group,maven会将该项目打成的jar包放本地路径:/com/companyname/project-group --><groupId>com.companyname.project-group</groupId><!-- 项目的唯一ID,一个groupId下面可能多个项目,就是靠artifactId来区分的 --><artifactId>project</artifactId><!-- 版本号 --><version>1.0.0</version><!--打包方式 默认:jar jar指的是普通的java项目打包方式! 项目打成jar包! war指的是web项目打包方式!项目打成war包! pom不会讲项目打包!这个项目作为父工程,被其他工程聚合或者继承!后面会讲解两个概念 --><packaging>jar/pom/war</packaging>3. Maven工程依赖管理配置
位置:pom.xml
依赖管理和依赖添加
<!-- 通过编写依赖jar包的gav必要属性,引入第三方依赖! scope属性是可选的,可以指定依赖生效范围! 依赖信息查询方式: 1. maven仓库信息官网 https://mvnrepository.com/ 2. mavensearch插件搜索 --><dependencies><!-- 引入具体的依赖包 --><dependency><groupId>log4j</groupId><artifactId>log4j</artifactId><version>1.2.17</version><!-- 依赖范围 --><scope>runtime</scope></dependency></dependencies>依赖版本统一提取和维护properties
<!--声明版本--><properties><!--命名随便,可以自定义属性--><junit.version>4.12</junit.version><!-- 也可以通过 maven规定的固定的key,配置maven的参数!如下配置编码格式!--><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding><project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding></properties><dependencies><dependency><groupId>junit</groupId><artifactId>junit</artifactId><!--引用properties声明版本 --><version>${junit.version}</version></dependency></dependencies>4.maven仓库信息官网
地址:
https://mvnrepository.com/在 Maven 项目中,只需在pom.xml的<dependencies>中填写依赖的坐标(包括 groupId、artifactId 和 version),Maven 就会自动从远程仓库(如 Maven Central)下载对应的 JAR 包。这些坐标的格式是标准化的,你可以通过 Maven 官方仓库搜索网站 查找任意开源库的正确坐标。
4. 依赖范围
通过设置坐标的依赖范围(scope),可以设置 对应jar包的作用范围:编译环境、测试环境、运行环境
| 依赖范围 | 描述 |
|---|---|
| compile | 编译依赖范围,scope 元素的默认值。使用此依赖范围的 Maven 依赖,对于三种 classpath 均有效,即该 Maven 依赖在上述三种 classpath 均会被引入。例如,log4j 在编译、测试、运行过程都是必须的。 |
| test | 测试依赖范围。使用此依赖范围的 Maven 依赖,只对测试 classpath 有效。例如,Junit 依赖只有在测试阶段才需要。 |
| provided | 已提供依赖范围。使用此依赖范围的 Maven 依赖,只对编译 classpath 和测试 classpath 有效。例如,servlet-api 依赖对于编译、测试阶段而言是需要的,但是运行阶段,由于外部容器已经提供,故不需要 Maven 重复引入该依赖。 |
| runtime | 运行时依赖范围。使用此依赖范围的 Maven 依赖,只对测试 classpath、运行 classpath 有效。例如,JDBC 驱动实现依赖,其在编译时只需 JDK 提供的 JDBC 接口即可,只有测试、运行阶段才需要实现了 JDBC 接口的驱动。 |
| system | 系统依赖范围,其效果与 provided 的依赖范围一致。其用于添加非 Maven 仓库的本地依赖,通过依赖元素 dependency 中的 systemPath 元素指定本地依赖的路径。鉴于使用其会导致项目的可移植性降低,一般不推荐使用。 |
| import | 导入依赖范围,该依赖范围只能与 dependencyManagement 元素配合使用,其功能是将目标 pom.xml 文件中 dependencyManagement 的配置导入合并到当前 pom.xml 的 dependencyManagement 中。 |
4.1 作用范围
- 编译环境编写环境就是指的是main目录下是否可以使用这个依赖
- 测试环境测试环境就是指的是test目录下是否可以使用这个依赖
- 运行环境就是指打成的包中会不会将jar包打进去
5. Maven工程依赖下载失败错误解决(重点)
在使用 Maven 构建项目时,可能会发生依赖项下载错误的情况,主要原因有以下几种:
- 下载依赖时出现网络故障或仓库服务器宕机等原因,导致无法连接至 Maven 仓库,从而无法下载依赖。
- 依赖项的版本号或配置文件中的版本号错误,或者依赖项没有正确定义,导致 Maven 下载的依赖项与实际需要的不一致,从而引发错误。
- 本地 Maven 仓库或缓存被污染或损坏,导致 Maven 无法正确地使用现有的依赖项。
解决方案:
- 检查网络连接和 Maven 仓库服务器状态。
- 确保依赖项的版本号与项目对应的版本号匹配,并检查 POM 文件中的依赖项是否正确。
- 清除本地 Maven 仓库缓存(lastUpdated 文件),因为只要存在lastupdated缓存文件,刷新也不会重新下载。本地仓库中,根据依赖的gav属性依次向下查找文件夹,最终删除内部的文件,刷新重新下载即可!例如: pom.xml依赖
<dependency><groupId>com.alibaba</groupId><artifactId>druid</artifactId><version>1.2.8</version></dependency>文件:
6. Maven工程Build构建配置
项目构建是指将源代码、依赖库和资源文件等转换成可执行或可部署的应用程序的过程,在这个过程中包括编译源代码、链接依赖库、打包和部署等多个步骤。
默认情况下,构建不需要额外配置,都有对应的默认配置。当然了,我们也可以在pom.xml定制一些配置,来修改默认构建的行为和产物!
例如:
- 指定构建打包文件的名称,非默认名称
- 制定构建打包时,指定包含文件格式和排除文件
- 打包插件版本过低,配置更高版本插件
构建配置是在pom.xml / build标签中指定!
指定打包命名
<!-- 默认的打包名称:artifactid+verson.打包方式 --><build><finalName>定义打包名称</finalName></build>指定打包文件
如果在java文件夹中添加java类,会自动打包编译到classes文件夹下!
但是在java文件夹中添加xml文件,默认不会被打包!
默认情况下,按照maven工程结构放置的文件会默认被编译和打包!
除此之外、我们可以使用resources标签,指定要打包资源的文件夹要把哪些静态资源打包到 classes根目录下!
应用场景:mybatis中有时会将用于编写SQL语句的映射文件和mapper接口都写在src/main/java下的某个包中,此时映射文件就不会被打包,如何解决
<build><!--设置要打包的资源位置--><resources><resource><!--设置资源所在目录--><directory>src/main/java</directory><includes><!--设置包含的资源类型--><include>**/*.xml</include></includes></resource></resources></build>配置依赖插件
dependencies标签下引入开发需要的jar包!我们可以在build/plugins/plugin标签引入插件!
常用的插件:修改jdk版本、tomcat插件、mybatis分页插件、mybatis逆向工程插件等等!
<build><plugins><!-- java编译插件,配jdk的编译版本 --><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-compiler-plugin</artifactId><configuration><source>1.8</source><target>1.8</target><encoding>UTF-8</encoding></configuration></plugin><!-- tomcat插件 --><plugin><groupId>org.apache.tomcat.maven</groupId><artifactId>tomcat7-maven-plugin</artifactId><version>2.2</version><configuration><port>8090</port><path>/</path><uriEncoding>UTF-8</uriEncoding><server>tomcat7</server></configuration></plugin></plugins></build>六、Maven依赖传递和依赖冲突
1. Maven依赖传递特性
概念
假如有Maven项目A,项目B依赖A,项目C依赖B。那么我们可以说 C依赖A。也就是说,依赖的关系为:C—>B—>A, 那么我们执行项目C时,会自动把B、A都下载导入到C项目的jar包文件夹中,这就是依赖的传递性。
作用
- 简化依赖导入过程
- 确保依赖版本正确
传递的原则
在 A 依赖 B,B 依赖 C 的前提下,C 是否能够传递到 A,取决于 B 依赖 C 时使用的依赖范围以及配置
- B 依赖 C 时使用 compile 范围:可以传递
- B 依赖 C 时使用 test 或 provided 范围:不能传递,所以需要这样的 jar 包时,就必须在需要的地方明确配置依赖才可以。
- B 依赖 C 时,若配置了以下标签,则不能传递
<dependency><groupId>com.alibaba</groupId><artifactId>druid</artifactId><version>1.2.15</version><optional>true</optional></dependency>依赖传递终止
- 非compile范围进行依赖传递
- 使用optional配置终止传递
- 依赖冲突(传递的依赖已经存在)
案例:导入jackson依赖
分析:jackson需要三个依赖
依赖传递关系:data-bind中,依赖其他两个依赖
最佳导入:直接可以导入data-bind,JackSon Core 和 Jackson Annotations会自动被导入
<!-- https://mvnrepository.com/artifact/com.fasterxml.jackson.core/jackson-databind --><dependency><groupId>com.fasterxml.jackson.core</groupId><artifactId>jackson-databind</artifactId><version>2.10.0</version></dependency>2. Maven依赖冲突特性
当直接引用或者间接引用出现了相同的jar包! 这时呢,一个项目就会出现相同的重复jar包,这就算作冲突!依赖冲突避免出现重复依赖,并且终止依赖传递!
maven自动解决依赖冲突问题能力,会按照自己的原则,进行重复依赖选择。同时也提供了手动解决的冲突的方式,不过不推荐!
解决依赖冲突(如何选择重复依赖)方式:
- 自动选择原则
- 短路优先原则(第一原则)看的是依赖的层级长短A—>B—>C—>D—>E—>X(version 0.0.1)A—>F—>X(version 0.0.2)则A依赖于X(version 0.0.2)。
- 依赖路径长度相同情况下,则“先声明优先”(第二原则)A—>E—>X(version 0.0.1)A—>F—>X(version 0.0.2)在中,先声明的,路径相同,会优先选择!
- 手动排除
<dependency><groupId>com.atguigu.maven</groupId><artifactId>pro01-maven-java</artifactId><version>1.0-SNAPSHOT</version><scope>compile</scope><!-- 使用excludes标签配置依赖的排除 --><exclusions><!-- 在exclude标签中配置一个具体的排除 --><exclusion><!-- 指定要排除的依赖的坐标(不需要写version) --><groupId>commons-logging</groupId><artifactId>commons-logging</artifactId></exclusion></exclusions></dependency>- 小案例伪代码如下:
前提: A 1.1 -> B 1.1 -> C 1.1 F 2.2 -> B 2.2 pom声明: F 2.2 A 1.1请问最终会导入哪些依赖和对应版本?答案是F
3. 依赖继承说明
Maven 的继承机制是递归的(而非单层或“传递”的):当一个子模块声明了父 POM,Maven 会自动沿<parent>链向上追溯,合并所有祖先 POM(包括祖父、曾祖父等)中的配置(如<properties>、<dependencyManagement>、<dependencies>等),形成最终的有效 POM;因此,只要某个配置(例如依赖版本管理)在任意祖先中定义,且未被中间父模块显式覆盖或清空,子模块就可以直接使用它——无需父模块“转发”或重复声明。
4. 打包补充
大家可能会疑惑:既然打 WAR 包时会把依赖的 JAR 一并打包进去,那为什么普通的 JAR 包不也把依赖一起打包呢?比如jackson-databind依赖其他库,为什么不直接把它们塞进自己的 JAR 里?
答案是:Maven 默认构建的 JAR(即普通 Java 库)是“非可执行”的,它只包含自身代码,不包含依赖。
运行时所需的依赖,由使用者根据该 JAR 对应的 POM 文件自动解析并引入。这种设计避免了依赖重复打包造成的冗余和版本冲突。
而WAR 包天生用于 Web 容器部署,规范要求它必须包含所有依赖(放在WEB-INF/lib下),所以 Maven 打 WAR 时会自动将传递依赖一并打包。
不过,如果你希望生成一个独立可运行的 JAR(俗称 “fat jar” 或 “uber jar”),就需要借助插件(如spring-boot-maven-plugin),它会把项目代码及其所有依赖打包成一个完整的 JAR。这正是 Spring Boot 应用在生产环境中常用的部署方式。
七、Maven工程继承和聚合关系
1. Maven工程继承关系
- 继承概念Maven 继承是指在 Maven 的项目中,让一个项目从另一个项目中继承配置信息的机制。继承可以让我们在多个项目中共享同一配置信息,简化项目的管理和维护工作。
- 继承作用在父工程中统一管理项目中的依赖信息。它的背景是:
它背后的需求是:
- 对一个比较大型的项目进行了模块拆分。 - 一个 project 下面,创建了很多个 module。 - 每一个 module 都需要配置自己的依赖信息。 - 在每一个 module 中各自维护各自的依赖信息很容易发生出入,不易统一管理。 - 使用同一个框架内的不同 jar 包,它们应该是同一个版本,所以整个项目中使用的框架版本需要统一。 - 使用框架时所需要的 jar 包组合(或者说依赖信息组合)需要经过长期摸索和反复调试,最终确定一个可用组合。这个耗费很大精力总结出来的方案不应该在新的项目中重新摸索。通过在父工程中为整个项目维护依赖信息的组合既保证了整个项目使用规范、准确的 jar 包;又能够将以往的经验沉淀下来,节约时间和精力。
3. 继承语法
- 父工程
<groupId>com.zhp</groupId><artifactId>maven-parent</artifactId><version>1.0-SNAPSHOT</version><!-- 当前工程作为父工程,它要去管理子工程,所以打包方式必须是 pom --><packaging>pom</packaging>- 子工程<!-- 使用parent标签指定当前工程的父工程 --><parent><groupId>com.zhp</groupId><artifactId>maven-parent</artifactId><version>1.0-SNAPSHOT</version></parent><!-- 子工程的坐标 --><!-- 如果子工程坐标中的groupId和version与父工程一致,那么可以省略 --><!-- <groupId>com.zhp</groupId> --><artifactId>maven-module</artifactId><!-- <version>1.0-SNAPSHOT</version> -->- 项目结构- 父工程依赖统一管理dependencies父工程中maven_parent的依赖如果直接用dependencies声明的,子工程会直接全部继承
- 父工程声明版本
<dependencies><dependency><groupId>org.springframework</groupId><artifactId>spring-core</artifactId><version>6.0.10</version></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-beans</artifactId><version>6.0.10</version></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-context</artifactId><version>6.0.10</version></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-expression</artifactId><version>6.0.10</version></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-aop</artifactId><version>6.0.10</version></dependency></dependencies>子工程全部继承了过来
- 父工程依赖统一管理dependencyManagement父工程中用dependencyManagement定义的依赖,父工程中不会导入依赖,子工程要想导入依赖必须显示的指定不然不会导入依赖
- 父工程声明版本
<!-- 使用dependencyManagement标签配置对依赖的管理 --><!-- 被管理的依赖并没有真正被引入到工程 --><dependencyManagement><dependencies><dependency><groupId>org.springframework</groupId><artifactId>spring-core</artifactId><version>6.0.10</version></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-beans</artifactId><version>6.0.10</version></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-context</artifactId><version>6.0.10</version></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-expression</artifactId><version>6.0.10</version></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-aop</artifactId><version>6.0.10</version></dependency></dependencies></dependencyManagement>子工程不显示指定不会导入
- 子工程显示指定引用版本
<!-- 子工程引用父工程中的依赖信息时,可以把版本号去掉。 --><!-- 把版本号去掉就表示子工程中这个依赖的版本由父工程决定。 --><!-- 具体来说是由父工程的dependencyManagement来决定。 --><dependencies><dependency><groupId>org.springframework</groupId><artifactId>spring-core</artifactId></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-beans</artifactId></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-context</artifactId></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-expression</artifactId></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-aop</artifactId></dependency></dependencies>这个时候就倒进来了
- 工程中使用dependencyManagement
Maven 仅支持单继承,即一个 POM 只能通过<parent>声明一个父项目。例如,maven-module继承了maven-parent后,就不能再继承其他 POM。但若需要统一管理来自其他项目的依赖版本,可以通过在父 POM 中使用<dependencyManagement>导入(import)其他 BOM(如<scope>import</scope>),从而间接复用其依赖版本定义,实现多源依赖的集中管控。
在maven_module的pom文件中加入
<dependencyManagement><dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-dependencies</artifactId><version>3.2.0</version><type>pom</type><scope>import</scope><!-- 关键! --></dependency></dependencies></dependencyManagement><dependencies><dependency><groupId>org.springframework</groupId><artifactId>spring-core</artifactId></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-beans</artifactId></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-context</artifactId></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-expression</artifactId></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-aop</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter</artifactId></dependency></dependencies>虽然maven-parent中并未直接声明spring-boot-starter,但通过在<dependencyManagement>中导入spring-boot-dependenciesBOM,子模块仍可直接使用spring-boot-starter等依赖而无需指定版本,从而在遵守 Maven 单继承限制的同时,灵活复用外部依赖管理配置。
在<dependencyManagement>中引入一个pom类型的项目(如 BOM)时,必须显式指定<type>pom</type>和<scope>import</scope>;否则 Maven 会默认将其视为jar类型、compile作用域的普通依赖,而这类 POM 通常不包含 JAR 文件,从而导致构建失败。
2. Maven工程聚合关系
- 聚合概念Maven 聚合是指将多个项目组织到一个父级项目中,以便一起构建和管理的机制。聚合可以帮助我们更好地管理一组相关的子项目,同时简化它们的构建和部署过程。
- 聚合作用
- 管理多个子项目:通过聚合,可以将多个子项目组织在一起,方便管理和维护。
- 构建和发布一组相关的项目:通过聚合,可以在一个命令中构建和发布多个相关的项目,简化了部署和维护工作。
- 优化构建顺序:通过聚合,可以对多个项目进行顺序控制,避免出现构建依赖混乱导致构建失败的情况。
- 统一管理依赖项:通过聚合,可以在父项目中管理公共依赖项和插件,避免重复定义。
- 聚合语法父项目中包含的子项目列表。
<project><groupId>com.example</groupId><artifactId>parent-project</artifactId><packaging>pom</packaging><version>1.0.0</version><modules><module>child-project1</module><module>child-project2</module></modules></project>- 聚合演示通过触发父工程构建命令、引发所有子模块构建!产生反应堆!
八、Maven私服
1. Maven私服简介
①私服简介
Maven 私服是一种特殊的Maven远程仓库,它是架设在局域网内的仓库服务,用来代理位于外部的远程仓库(中央仓库、其他远程公共仓库)。
当然也并不是说私服只能建立在局域网,也有很多公司会直接把私服部署到公网,具体还是得看公司业务的性质是否是保密的等等,因为局域网的话只能在公司用,部署到公网的话员工在家里也可以办公使用。
建立了 Maven 私服后,当局域网内的用户需要某个构件时,会按照如下顺序进行请求和下载。
请求本地仓库,若本地仓库不存在所需构件,则跳转到第 2 步;
请求 Maven 私服,将所需构件下载到本地仓库,若私服中不存在所需构件,则跳转到第 3 步。
请求外部的远程仓库,将所需构件下载并缓存到 Maven 私服,若外部远程仓库不存在所需构件,则 Maven 直接报错。
此外,一些无法从外部仓库下载到的构件,也能从本地上传到私服供其他人使用。
②Maven私服的优势
- 节省外网带宽
消除对外部远程仓库的大量重复请求(会消耗很大量的带宽),降低外网带宽压力。 - 下载速度更快
Maven私服位于局域网内,从私服下载构建更快更稳定。 - 便于部署第三方构件
有些构件无法从任何一个远程仓库中获得(如:公司或组织内部的私有构件、Oracle的JDBC驱动等),建立私服之后,就可以将这些构件部署到私服中,供内部Maven项目使用。 - 提高项目的稳定性,增强对项目的控制
如果不建立私服,那么Maven项目的构件就高度依赖外部的远程仓库,若外部网络不稳定,则项目的构建过程也会变得不稳定。建立私服后,即使外部网络状况不佳甚至中断,只要私服中已经缓存了所需的构件,Maven也能够正常运行。私服软件(如:Nexus)提供了很多控制功能(如:权限管理、RELEASE/SNAPSHOT版本控制等),可以对仓库进行一些更加高级的控制。 - 降低中央仓库得负荷压力
由于私服会缓存中央仓库得构件,避免了很多对中央仓库的重复下载,降低了中央仓库的负荷。
③常见的Maven私服产品
- Apache的Archiva
- JFrog的Artifactory
- Sonatype的Nexus([ˈneksəs])(当前最流行、使用最广泛)
2. Nexus下载安装
下载地址:https://help.sonatype.com/repomanager3/product-information/download
虚拟机中提前安装好1.8以上版本的jdk
在虚拟机中输入arch
- 如果输出是:
x86_64→ 选x86-64 - 如果输出是:
aarch64→ 选aarch64(即 ARM64)
将下载好的压缩包上传到服务器中,然后解压压缩包
tar -xvf nexus-3.87.0-03-linux-x86_64.tar.gz进入bin目录下执行start启动nexus
./nexus start停止nexus的命令是后边加stop
首页地址:http://http://192.168.116.129/:8081/,8081为默认端口号
3. 初始设置
账户是admin,密码在给的文件下
这里参考提示:
- 用户名:admin
- 密码:查看E:\Server\nexus-3.61.0-02-win64\sonatype-work\nexus3\admin.password文件
继续执行初始化:
匿名登录,启用还是禁用?由于启用匿名登录后,后续操作比较简单,这里我们演示禁用匿名登录的操作:
初始化完毕:
4. Nexus上的各种仓库
| 仓库类型 | 说明 |
|---|---|
| proxy | 某个远程仓库的代理 |
| group | 存放:通过 Nexus 获取的第三方 jar 包 |
| hosted | 存放:本团队其他开发人员部署到 Nexus 的 jar 包 |
| 仓库名称 | 说明 |
|---|---|
| maven-central | Nexus 对 Maven 中央仓库的代理。就是指定第三方maven的仓库比如阿里云镜像 |
| maven-public | Nexus 默认创建,供开发人员下载使用的组仓库。从第三方下载下来的jar包就放到这里 |
| maven-releases | Nexus 默认创建,供开发人员部署自己 jar 包的宿主仓库 要求 releases 版本 |
| maven-snapshots | Nexus 默认创建,供开发人员部署自己 jar 包的宿主仓库 要求 snapshots 版本 |
初始状态下,这几个仓库都没有内容:
5. 通过 Nexus 下载 jar 包
修改本地maven的核心配置文件settings.xml,设置新的本地仓库地址
<!-- 配置一个新的 Maven 本地仓库 --><localRepository>F:\maven-repository-new</localRepository>把我们原来配置阿里云仓库地址的 mirror 标签改成下面这样:
<mirror><id>nexus-mine</id><mirrorOf>central</mirrorOf><name>Nexus mine</name><url>http://192.168.116.129:8081/repository/maven-public/</url></mirror>这里的 url 标签是这么来的:
把上图中看到的地址复制出来即可。如果我们在前面允许了匿名访问,到这里就够了。但如果我们禁用了匿名访问,那么接下来我们还要继续配置 settings.xml:
<server><id>nexus-mine</id><username>admin</username><password>admin</password></server>这里需要格外注意:server 标签内的 id 标签值必须和 mirror 标签中的 id 值一样。
找一个用到框架的 Maven 工程,执行命令:
mvn clean compile下载过程日志:
Downloading from nexus-mine: http://192.168.116.129:8081/repository/maven-public/org/apache/maven/plugins/maven-clean-plugin/3.2.0/maven-clean-plugin-3.2.0.pom
Downloaded from nexus-mine: http://192.168.116.129:8081/repository/maven-public/org/apache/maven/plugins/maven-clean-plugin/3.2.0/maven-clean-plugin-3.2.0.pom (5.3 kB at 2.6 kB/s)
Downloading from nexus-mine: http://192.168.116.129:8081/repository/maven-public/org/apache/maven/plugins/maven-plugins/35/maven-plugins-35.pom
Downloaded from nexus-mine: http://192.168.116.129:8081/repository/maven-public/org/apache/maven/plugins/maven-plugins/35/maven-plugins-35.pom (9.9 kB at 9.8 kB/s)
Downloading from nexus-mine: http://192.168.116.129:8081/repository/maven-public/org/apache/maven/maven-parent/35/maven-parent-35.pom
Downloaded from nexus-mine: http://192.168.116.129:8081/repository/maven-public/org/apache/maven/maven-parent/35/maven-parent-35.pom (45 kB at 49 kB/s)
Downloading from nexus-mine: http://192.168.116.129:8081/repository/maven-public/org/apache/apache/25/apache-25.pom
下载后,Nexus 服务器上就有了 jar 包:
若下载速度太慢,可以设置私服中中央仓库的地址为阿里云仓库地址
修改为:http://maven.aliyun.com/nexus/content/groups/public/
6. 将 jar 包部署到 Nexus
maven工程中配置:
<distributionManagement><snapshotRepository><id>nexus-mine</id><name>Nexus Snapshot</name><url>http://192.168.116.129:8081/repository/maven-snapshots/</url></snapshotRepository></distributionManagement>注意:这里 snapshotRepository 的 id 标签必须和 settings.xml 中指定的 mirror 标签的 id 属性一致。
执行部署命令:
mvn deploy7. 引用别人部署的 jar 包
maven工程中配置:
<repositories><repository><id>nexus-mine</id><name>nexus-mine</name><url>http://192.168.116.129:8081/repository/maven-snapshots/</url><snapshots><enabled>true</enabled></snapshots><releases><enabled>true</enabled></releases></repository></repositories>九、Maven综合案例
介绍一下生产中Maven实际使用案例
1. 项目需求和结构分析
需求案例:搭建一个电商平台项目,该平台包括用户服务、订单服务、通用工具模块等。
项目架构:
- 用户服务:负责处理用户相关的逻辑,例如用户信息的管理、用户注册、登录等。
- spring-context 6.0.6
- spring-core 6.0.6
- spring-beans 6.0.6
- common-service
- 订单服务:负责处理订单相关的逻辑,例如订单的创建、订单支付、退货、订单查看等。
- spring-context 6.0.6
- spring-core 6.0.6
- spring-beans 6.0.6
- spring-security 6.0.6
- common-service
- 通用模块:负责存储其他服务需要通用工具类,其他服务依赖此模块。
- commons-io 2.11.0
- junit 5.9.2
2. 项目搭建和统一构建
①父模块 (micro-shop)
创建工程:
pom.xml配置:
<?xml version="1.0" encoding="UTF-8"?><projectxmlns="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.zhp</groupId><artifactId>micro-shop</artifactId><version>1.0-SNAPSHOT</version><properties><spring.version>6.0.6</spring.version><jackson.version>2.15.0</jackson.version><commons.version>2.11.0</commons.version><junit.version>5.9.2</junit.version><maven.compiler.source>8</maven.compiler.source><maven.compiler.target>8</maven.compiler.target><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding></properties><!-- 依赖管理 --><dependencyManagement><dependencies><!-- spring-context会依赖传递core/beans --><dependency><groupId>org.springframework</groupId><artifactId>spring-context</artifactId><version>${spring.version}</version></dependency><!-- jackson-databind会依赖传递core/annotations --><dependency><groupId>com.fasterxml.jackson.core</groupId><artifactId>jackson-databind</artifactId><version>${jackson.version}</version></dependency><!-- commons-io --><dependency><groupId>commons-io</groupId><artifactId>commons-io</artifactId><version>${commons.version}</version></dependency><!-- https://mvnrepository.com/artifact/org.junit.jupiter/junit-jupiter-api --><dependency><groupId>org.junit.jupiter</groupId><artifactId>junit-jupiter-api</artifactId><version>${junit.version}</version><scope>test</scope></dependency></dependencies></dependencyManagement></project>可选操作:删除src目录
②通用模块 (common-service)
创建工程:
pom.xml配置:
<?xml version="1.0" encoding="UTF-8"?><projectxmlns="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><parent><groupId>com.zhp</groupId><artifactId>micro-shop</artifactId><version>1.0-SNAPSHOT</version></parent><artifactId>common-service</artifactId><properties><maven.compiler.source>8</maven.compiler.source><maven.compiler.target>8</maven.compiler.target><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding></properties><dependencies><!-- 配置spring-context,继承父工程版本,自动传递 core / beans --><dependency><groupId>org.springframework</groupId><artifactId>spring-context</artifactId></dependency><!-- 配置jackson-databind,继承父工程版本,自动传递 core / annotations --><dependency><groupId>com.fasterxml.jackson.core</groupId><artifactId>jackson-databind</artifactId></dependency><!-- 配置commons-io,继承父工程版本 --><dependency><groupId>commons-io</groupId><artifactId>commons-io</artifactId></dependency><!-- 配置junit,继承父工程版本 --><dependency><groupId>org.junit.jupiter</groupId><artifactId>junit-jupiter-api</artifactId><scope>test</scope></dependency></dependencies></project>③用户模块 (user-service)
创建工程:
pom.xml配置:
<?xml version="1.0" encoding="UTF-8"?><projectxmlns="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><parent><groupId>com.zhp</groupId><artifactId>micro-shop</artifactId><version>1.0-SNAPSHOT</version></parent><artifactId>user-service</artifactId><properties><maven.compiler.source>8</maven.compiler.source><maven.compiler.target>8</maven.compiler.target><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding></properties><dependencies><!-- 配置common-service,所需依赖会传递到当前工程(仅限compile范围) --><dependency><groupId>com.zhp</groupId><artifactId>common-service</artifactId><version>1.0-SNAPSHOT</version></dependency></dependencies></project>依赖传递结果:
④订单模块 (order-service)
创建工程,并使用插件转为web工程:
pom.xml配置:
<?xml version="1.0" encoding="UTF-8"?><projectxmlns="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><parent><groupId>com.zhp</groupId><artifactId>micro-shop</artifactId><version>1.0-SNAPSHOT</version></parent><artifactId>order-service</artifactId><properties><maven.compiler.source>8</maven.compiler.source><maven.compiler.target>8</maven.compiler.target><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding></properties><dependencies><!-- 配置common-service,所需依赖会传递到当前工程(仅限compile范围) --><dependency><groupId>com.zhp</groupId><artifactId>common-service</artifactId><version>1.0-SNAPSHOT</version></dependency></dependencies></project>此时,查看父工程的pom.xml,会发现其中已经自动聚合了子工程:
<modules><module>common-service</module><module>user-service</module><module>order-service</module></modules>在父工程中执行package,子工程都进行了package。这就是聚合