JavaWeb Maven
2025.05.07
JavaWeb学习之Maven
一、Maven简介
- Maven是apache旗下的一个开源项目,是一款用于管理和构建Java项目的工具。
- Maven的作用:
- 依赖管理:方便快捷的管理项目依赖的资源(jar包),避免版本冲突问题
- 统一项目结构:提供标准、统一的项目结构
- 项目构建:标准跨平台(Linux、Windows、MacOS)的自动化项目构建方式
- 官网:https://maven.apache.org/

- Maven仓库:用于存储资源,管理各种jar包
- 本地仓库:自己计算机上的一个目录
- 中央仓库:由Maven团队维护的全球唯一的仓库,地址为https://repo1.maven.org/maven2/
- 远程仓库(私服):公司内部搭建的仓库,存放公司内部的jar包,避免每次都从中央仓库下载
二、Maven的安装
- 官网下载:https://maven.apache.org/download.cgi
- 解压到指定目录
- 配置本地仓库
- 修改conf/settings.xml中的<localRepository>为一个指定目录
1
<localRepository>D:\maven\repository</localRepository>
- 配置阿里云私服:修改conf/settings.xml中的<mirrors>标签,为其添加如下子标签:
1
2
3
4
5
6<mirror>
<id>alimaven</id>
<name>aliyun maven</name>
<url>https://maven.aliyun.com/nexus/content/groups/public/</url>
<mirrorOf>central</mirrorOf>
</mirror> - 配置环境变量
- MAVEN_HOME为maven的解压目录,并将其bin目录添加到PATH中

- Maven坐标
- 是资源的唯一标识,通过该坐标可以唯一定位资源位置
- 使用坐标来定义项目或引入项目中需要的依赖
- Maven坐标主要组成
- groupld: 定义当前Maven项目隶属组织名称( 通常是域名反写,例如: com.itheima)
- artifactld: 定义当前Maven项目名称(通常是模块名称,例如order-service、goods-service)
- version: 定义当前项目版本号

三、IDEA导入Maven项目
- 方式一:打开IDEA,选择右侧Maven面板,点击+号,选中对应项目的pom.xml文件,双击即可

- 方式二:打开IDEA,选择右侧Maven面板,点击+号,选中对应项目的pom.xml文件,双击即可

四、依赖传递
4.1 依赖配置
- 依赖:指当前项目运行所需要的jar包,一个项目中可以引入多个依赖
- 配置:
- 在pom.xml中添加<dependencies>标签
- 在<dependencies>标签中使用<dependency>标签引入坐标
- 定义坐标的groupId、artifactId、version
- 点击刷新按钮,引入最新加入的坐标
1
2
3
4
5
6
7<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<version>5.3.9</version>
</dependency>
</dependencies> - 依赖信息:https://mvnrepository.com/
4.2 依赖传递
- 依赖传递:当一个项目引入了某个jar包,且该jar包又依赖于其他jar包时,Maven会自动下载这些jar包
- 直接依赖:在当前项目中通过依赖配置建立的依赖关系
- 间接依赖:被依赖的资源如果依赖其他资源,当前项目间接依赖其他资源
- 在IDEA中右键选择Diagram -> Show Dependencies可以查看依赖关系图

- 排除依赖:排除依赖指主动断开依赖的资源,被排除的资源无需指定版本
1
2
3
4
5
6
7
8
9
10
11<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<version>5.3.9</version>
<exclusions>
<exclusion>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
</exclusion>
</exclusions>
</dependency>
4.3 依赖范围
- 依赖的jar包,默认情况下,可以在任何地方使用,可以通过<scope>…</scope>设置其作用范围
- 作用范围:
- 主程序范围有效(main文件夹范围内)
- 测试范围有效(test文件夹范围内)
- 是否参与打包运行(package指令范围内)
- 示例:
1
2
3
4
5
6<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<version>5.3.9</version>
<scope>test</scope>
</dependency> - scope常见取值:
| scope值 | 主程序 | 测试程序 | 打包(运行) | 范例 |
|---|---|---|---|---|
| compile(默认) | Y | Y | Y | log4j |
| test | - | Y | - | junit |
| provided | Y | Y | - | servlet-api |
| runtime | - | Y | Y | jdbc驱动 |
4.4 生命周期
- Maven的生命周期就是为了对所有的maven项目构建过程进行抽象和统一
- Maven中有三套相互独立的生命周期
- clean:清理工作
- default:核心工作,如:编译、测试、打包、安装、部署等
- site:生成报告、发布站点等

- 生命周期阶段:
- clean:移除上一次构建生成的文件
- compile:编译项目源代码
- test:使用合适的单元测试框架运行测试(junit)
- package:将编译后的文件打包,如jar、war等
- install:安装项目到本地仓库
- 注意事项:在同一套生命周期中,运行后面的阶段时,前面的阶段都会运行
- 执行指定生命周期的两种方式:
- 在idea中,右侧的maven工具栏,选中对应的生命周期,双击执行
- 在命令行中,通过命令执行

2025.06.02
五、Maven高级
5.1 分模块设计
5.1.1 介绍
所谓分模块设计,顾名思义指的就是我们在设计一个 Java 项目的时候,将一个 Java 项目拆分成多个模块进行开发。
1. 未分模块设计的问题

如果项目不分模块,也就意味着所有的业务代码是不是都写在这一个 Java 项目当中。随着这个项目的业务扩张,项目当中的业务功能可能会越来越多,非常不方便。因为 Java 项目当中包含了当前项目的所有业务代码,所以就造成了这里面所封装的一些组件会难以复用。
总结起来,主要两点问题:不方便项目的维护和管理、项目中的通用组件难以复用。
2. 分模块设计
分模块设计我们在进行项目设计阶段,就可以将一个大的项目拆分成若干个模块,每一个模块都是独立的。

比如我们可以将商品的相关功能放在商品模块当中,搜索的相关业务功能我都封装在搜索模块当中,还有像购物车模块、订单模块。而为了组件的复用,我们也可以将项目当中的实体类、工具类以及我们定义的通用的组件都单独的抽取到一个模块当中。
分模块设计就是将项目按照功能/结构拆分成若干个子模块,方便项目的管理维护、拓展,也方便模块键的相互调用、资源共享。
5.1.2 实践
- 分模块设计
- 将pojo包下的实体类,抽取到一个maven模块中 tlias-pojo
- 将utils包下的工具类,抽取到一个maven模块中 tlias-utils
- 其他的业务代码,放在tlias-web-management这个模块中,在该模块中需要用到实体类pojo、工具类utils,直接引入对应的依赖即可。

注意:分模块开发需要先针对模块功能进行设计,再进行编码。不会先将工程开发完毕,然后进行拆分。
PS:当前我们是为了演示分模块开发,所以是基于我们前面开发的案例项目进行拆分的,实际中都是分模块设计,然后再开发的。
项目结构:


- springboot-tlias中xml文件引入
1 | <dependency> |
5.2 继承与聚合
5.2.1 继承关系实现
-
继承
- 概念:继承描述的是两个工程间的关系,与java中的继承相似,子工程可以继承父工程中的配置信息,常见于依赖关系的继承
- 作用:简化依赖配置、统一管理依赖
- 实现:<parent>…</parent>

-
步骤
- 创建maven模块tlias-parent,该工程为父工程,设置打包方式pom(默认为jar)
- jar:普通模块打包,springboot项目基本都是jar包(内嵌tomcat运行)
- war:普通web程序打包,需要部署在外部的tomcat服务器中运行
- pom:父工程或聚合工程,该模块不写代码,仅进行依赖管理
- 在子工程的pom.xml中配置继承关系
- 在父工程中配置各个工程共有的依赖(子工程会自动继承父工程的依赖)

-
代码实现
- tlias-parent/pom.xml
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
<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>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>3.3.12</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.itheima</groupId>
<artifactId>tlias-parent</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>pom</packaging>
<dependencies>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.38</version>
</dependency>
</dependencies>
<properties>
<maven.compiler.source>17</maven.compiler.source>
<maven.compiler.target>17</maven.compiler.target>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
</project>- 子工程(springboot-tlias/tlias-pojo/tlias-utils)/pom.xml
1
2
3
4
5
6<parent>
<groupId>com.itheima</groupId>
<artifactId>tlias-parent</artifactId>
<version>1.0-SNAPSHOT</version>
<relativePath>../tlias-parent/pom.xml</relativePath>
</parent> -
注意事项:若父子工程都配置了一个依赖的不同版本,以子工程的为准
5.2.2 版本锁定
- 问题:如何管理部分模块共同使用的依赖版本
- 版本锁定
- 在maven中,可以在父工程的pom文件中通过<dependencyManagement>来统一管理依赖版本
- 子工程在引入依赖时,无需指定<version>,直接使用父工程中定义的版本即可
- 父工程pom.xml
1
2
3
4
5
6
7
8
9
10<dependencyManagement>
<dependencies>
<!-- JWT令牌 -->
<dependency>
<groupId>io.jsonwebtoken</groupId>
<artifactId>jjwt</artifactId>
<version>0.9.1</version>
</dependency>
</dependencies>
</dependencyManagement>- 子工程pom.xml
1
2
3
4
5
6
7<dependencies>
<dependency>
<groupId>io.jsonwebtoken</groupId>
<artifactId>jjwt</artifactId>
<!-- 无需指定版本 -->
</dependency>
</dependencies> - 自定义属性/引用属性
- 在父工程的pom.xml中,可以通过<properties>标签定义一些自定义属性
- 在子工程中可以通过引用父工程的属性来使用
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22<properties>
<lombok.version>1.18.38</lombok.version>
<jjwt.version>0.9.1</jjwt.version>
</properties>
<dependencyManagement>
<dependencies>
<!-- JWT令牌 -->
<dependency>
<groupId>io.jsonwebtoken</groupId>
<artifactId>jjwt</artifactId>
<version>${jjwt.version}</version>
</dependency>
<!-- lombok -->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>${lombok.version}</version>
</dependency>
</dependencies>
</dependencyManagement>
5.2.3 聚合
- 问题:再将一个包打包时,需要将其依赖的其他包先install到本地仓库中,才能package打包
- 聚合
- 概念:将多个模块组织称一个整体,同时进行项目的构建
- 聚合工程
- 一个不具有业务功能的“空”工程(有且仅有一个pom文件)(父工程)
- 作用
- 快速构建项目,无需根据依赖关系手动构建,直接在聚合工程上构建即可

- 实现
- 在父工程pom.xml中添加<modules>标签,指定子模块
- 聚合工程中所包含的模块,在构建时会自动根据模块间的依赖关系设置构建顺序,与聚合工程中模块的配置书写位置无关
- 聚合工程(父工程)pom.xml
1
2
3
4
5<modules>
<module>../tlias-pojo</module>
<module>../tlias-utils</module>
<module>../springboot-tlias</module>
</modules>
5.2.4 总结
- 继承与聚合
- 作用
- 聚合用于快速构建项目
- 继承用于简化依赖配置、统一管理依赖
- 相同点
- 聚合与继承的pom.xml文件打包方式均为pom,可以将两种关系制作到同一个pom文件中
- 聚合与继承均属于设计型模块,并无实际的模块内容
- 不同点
- 聚合是在聚合工程中配置关系,聚合可以感知到参与聚合的模块有哪些
- 继承是在子模块中配置关系,父模块无法感知哪些子模块继承了自己
- 作用
5.3 Maven私服
5.3.1 私服介绍
- 私服是一种特殊的远程仓库,它是架设在局域网内的仓库服务,用来代理位于外部的中央仓库,用于解决团队内部的资源共享与资源同步问题
- 私服在企业项目开发中,一个项目/公司只需要一台即可(无需我们自己搭建,会使用即可)
5.3.2 资源上传与下载

- 项目版本
- RELEASE (发行版本) :功能趋于稳定、当前更新停止,可以用于发行的版本,存储在私服中的RELEASE仓库中
- SNAPSHOT (快照版本) :功能不稳定、尚处于开发中的版本,即快照版本,存储在私服的SNAPSHOT仓库中
- 实现
- 设置私服的访问用户名/密码(setting.xml中的servers中配置)
1
2
3
4
5
6
7
8
9
10
11
12<servers>
<server>
<id>maven-release</id>
<username>admin</username>
<password>admin</password>
</server>
<server>
<id>maven-snapshots</id>
<username>admin</username>
<password>admin</password>
</server>
</servers>- IDEA的maven工程的pom文件中配置上传(发布)地址
1
2
3
4
5
6
7
8
9
10<distributionManagement>
<repository>
<id>maven-release</id>
<url>http://localhost:8081/repository/maven-releases/</url>
</repository>
<snapshotRepository>
<id>maven-snapshots</id>
<url>http://localhost:8081/repository/maven-snapshots/</url>
</snapshotRepository>
</distributionManagement>- 设置私服依赖下载的仓库组地址(setting.xml中的mirrors、profiles中配置)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28<mirrors>
<mirror>
<id>maven-public</id>
<mirrorOf>*</mirrorOf>
<url>https://localhost:8081/repository/maven-public</url>
</mirror>
</mirrors>
<profiles>
<profile>
<id>maven-public</id>
<activation>
<activeByDefault>true</activeByDefault>
</activation>
<repositories>
<repository>
<id>maven-public</id>
<url>https://localhost:8081/repository/maven-public</url>
<releases>
<enabled>true</enabled>
</releases>
<snapshots>
<enabled>true</enabled>
</snapshots>
</repository>
</repositories>
</profile>
</profiles>- 发布项目,直接运行deploy生命周期即可 (发布时,建议跳过单元测试)
