2025.05.07

JavaWeb学习之Maven

一、Maven简介

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

Maven模型

  • 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中

IDEA创建Maven项目

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

Maven坐标组成

三、IDEA导入Maven项目

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

四、依赖传递

4.1 依赖配置

  • 依赖:指当前项目运行所需要的jar包,一个项目中可以引入多个依赖
  • 配置:
    1. 在pom.xml中添加<dependencies>标签
    2. 在<dependencies>标签中使用<dependency>标签引入坐标
    3. 定义坐标的groupId、artifactId、version
    4. 点击刷新按钮,引入最新加入的坐标
    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:生成报告、发布站点等

Maven生命周期

  • 生命周期阶段:
    • 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
2
3
4
5
6
7
8
9
10
11
<dependency>
<groupId>com.itheima</groupId>
<artifactId>tlias-pojo</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>

<dependency>
<groupId>com.itheima</groupId>
<artifactId>tlias-utils</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>

5.2 继承与聚合

5.2.1 继承关系实现

  • 继承

    • 概念:继承描述的是两个工程间的关系,与java中的继承相似,子工程可以继承父工程中的配置信息,常见于依赖关系的继承
    • 作用:简化依赖配置、统一管理依赖
    • 实现:<parent>…</parent>
  • 步骤

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

    • 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
    <?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 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仓库中
  • 实现
    1. 设置私服的访问用户名/密码(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>
    1. 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>
    1. 设置私服依赖下载的仓库组地址(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>
    1. 发布项目,直接运行deploy生命周期即可 (发布时,建议跳过单元测试)