网站Logo 苏叶的belog

Maven基础

wdadwa
2
2026-02-26

一,Maven概述

Maven 作为一个构建工具,不仅能帮我们自动化构建,还能够抽象构建过程,提供构建任务实现; 它跨平台,对外提供了一致的操作接口,这一切足以使它成为优秀的、流行的构建工具。

Maven 不仅是构建工具,还是一个依赖管理工具和项目管理工具,它提供了中央仓库,能帮我自动下载第三方 jar 包。

Maven 项目的核心是pom.xml 文件,POM(Project Object Model,项目对象模型)定义了项目的基本信息,用于描述项目如何构建,声明项目依赖,一个 pom.xml 文件就代表一个项目。

Maven 的关系图:

2953321-20240709222239074-1374461817.png

Maven 的作用:

  • 项目构建:提供了标准的,跨平台的自动化项目构建方式

  • 依赖管理:发表快捷的管理项目依赖的 jar 包,避免 jar 包之间的版本冲突问题。

  • 统一开发结构:提供标准的,统一的项目结构。

    Maven 的统一 java 项目图:

2953321-20240709222238863-1132047176.png

二,Maven安装与配置

Maven 是一个绿色软件,可以直接解压压缩包安装。

Maven 下载地址:Maven – Welcome to Apache Maven

如下图:

  • Linux版本下载bin.tar.gz结尾的
  • Windows版本下载bin.zip结尾的

2953321-20240709222238816-406496773.png

Maven 文件夹说明:

2953321-20240709222238734-1796727797.png

Maven 环境变量配置:

  1. Maven 依赖 java,需要 JAVA_HOME 已经配置好。

  2. 配置 MAVEN_HOME,值是 maven 的安装路径
    2953321-20240709222238819-2017517674.png

  3. 配置 path,填入:%MAVEN_HOME%\bin
    2953321-20240709222238851-302271720.png

  4. 在 cmd 中使用mvn来测试是否配置成功,配置成功效果如下图:
    2953321-20240709222240017-253829662.png

  5. Maven 本地仓库配置
    在 Maven 安装路径中的 conf 文件夹中的 settings.xml 文件中编辑
    2953321-20240709222238804-1049274584.png

  6. Maven 配置阿里源( 这一步相当于配置私服,阿里云给的私服,因为默认的中央仓库是国外仓库)
    2953321-20240709222238890-1221609259.png

    <!-- 阿里云仓库 -->
    <mirror>
        <id>alimaven</id>
    	<mirrorOf>central</mirrorOf>
    	<name>aliyun maven</name>
    <url>http://maven.aliyun.com/nexus/content/repositories/central/</url>
    </mirror>
    
  7. Maven 配置 jdk
    2953321-20240709222238942-484714134.png

    	<!-- java jdk1.8版本 -->
        <profile>
          <id>jdk-1.8</id>
          <activation>
            <activeByDefault>true</activeByDefault>
            <jdk>1.8</jdk>
          </activation>
          <properties>
            <maven.compiler.source>1.8</maven.compiler.source>
            <maven.compiler.target>1.8</maven.compiler.target>    
    		<maven.compiler.compilerVersion>1.8</maven.compiler.compilerVersion>
          </properties>
        </profile>
    

三,Maven基础概念

3.1 仓库

仓库:用于存储资源,包含各种 jar 包。

仓库分类:

  • 本地仓库:自己电脑上存储资源的仓库,连接远程仓库获取资源。
  • 远程仓库:非本机电脑上的仓库,为本地仓库提供资源。
    • 中央仓库:Maven团队维护,存储了所有。
    • 私服:部门/公司范围内存储资源的仓库,从中央仓库获取。

私服的作用:

  • 保护具有版权的资源,包含购买或自主研发的jar包。
  • 一定范围内共享资源,仅对内部开放,不对外共享。

3.2 坐标

坐标:Maven 中用于描述仓库中资源的位置。

Maven 坐标的主要组成:

  • groupId:定义当前 Maven 项目隶属组织名(通常为域名反写)

  • artifactId:定义当前 Maven 项目名(通常是模块名)

  • version:定义当前项目版本号

    • release代表完成版
    • snapshot代表开发版
  • packaging:定义打包方式

    • web工程打包为war包
    • java工程打包为jar包

Maven 坐标如下:

<!--maven项目的组织id-->
<groupId>com.normaling</groupId>
<!--maven项目名-->
<artifactId>Main</artifactId>
<!--maven项目版本-->
<version>0.0.1-SNAPSHOT</version>
<!--名字,可不写-->
<name>Main</name>
<!--描述,可不写-->
<description>Main</description>

Maven 坐标的作用:使用唯一标识,唯一性定位资源位置,通过该标识可以将资源的识别与下载工作交给机器完成。

maven 坐标查找资源可以通过Maven Repository

3.3 Maven项目目录结构

Maven 项目目录结构如下:

2953321-20240709222239078-1219940100.png

src

  • main

    • java: 该目录是项目的主要源代码目录。所有 Java 源代码都应该放在这里。Maven 会将这些源代码编译为项目的主要类文件。

      在 java 文件夹中,采用 src/main/java/com/example:Java 代码通常按照包的结构组织,这里使用的是一个示例包名。

    • resources: 在这个目录下,你可以放置项目的主要资源文件,如配置文件、属性文件、XML 文件等。这些文件会被打包到项目的输出文件中,使其在运行时可用。

      • static:用于存放Web应用程序的静态资源,如图片、样式表等。
      • templates:用于存放Web应用程序的模板文件,如Thymeleaf或Freemarker模板。
    • webapp: 如果项目是一个 Web 应用程序,这个目录是存放 Web 应用程序的根目录。在这里,你可以放置 Web 应用程序的静态资源,如 HTML、CSS、JavaScript 文件以及 WEB-INF 目录和 web.xml 文件。

  • test

    • java: 该目录是用于编写项目的单元测试代码。在这里,你可以编写各种针对项目代码的测试用例。Maven会在构建过程中执行这些测试。
    • resources: 与src/main/resources类似,这里是放置测试所需的资源文件。例如,如果你的测试需要读取一个测试数据文件,可以将它放在这个目录中。
  • target: 这个目录是 Maven 构建过程的输出目录。所有的构建结果,包括编译后的类文件、打包后的 JAR 或 WAR 文件,都会被放在这个目录下。

pom.xml: 这个文件是 Maven 项目的核心文件,称为 "Project Object Model"(项目对象模型)。它描述了项目的依赖关系、构建配置、插件等信息。在 pom.xml 中定义的信息可以让 Maven 自动管理项目的构建和依赖。


3.4 Maven项目构建命令

Maven 构建命令使用mvn开头,后面添加功能参数,可以一次性执行多个命令,使用空格分隔。

mvn compile		#编译
mvn clean		#清理maven项目编译后的文件
mvn test		#测试当前maven项目,就是执行test目录下的代码
mvn package		#将maven项目打包
mvn install		#将maven项目安装到本地仓库

四,Maven依赖管理

4.1 依赖配置

依赖:指的是当前项目运行所需要的 jar 包,一个项目可以设置多个依赖。

格式:

<!--xml文件固定头-->
<?xml version="1.0" encoding="UTF-8"?>
<!--xml文件的schema约束的引入-->
<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">
	<!--当前maven模块版本,不需要改,固定格式-->
    <modelVersion>4.0.0</modelVersion>
    <properties>
        <!--当前maven项目的jdk版本-->
        <java.version>11</java.version>
    </properties>
    <!--依赖设置-->
    <dependencies>
        <!--具体的依赖-->
        <dependency>
            <!--依赖所属组织id-->
            <groupId></groupId>
            <!--依赖所属项目id-->
            <artifactId></artifactId>
            <!--依赖版本-->
            <version></version>
        </dependency>
    </dependencies>
</project>

4.2 依赖传递

依赖具有传递性,分为:

  • 直接依赖:在当前项目中通过依赖配置建立的依赖关系。
  • 间接依赖:被资源的资源方通过依赖其他资源,则当前项目间接依赖其他资源。

在配置依赖的时候会存在版本不同等问题导致的依赖冲突问题,maven 根据如下策略来解决:

  • 路径优先:当依赖中出现相同的资源时,层级越深,优先级越低,层级越浅,优先级越高
  • 声明优先:当资源在相同层级被依赖时,配置顺序靠前的覆盖配置顺序靠后的
  • 特殊优先:当同级配置了相同资源的不同版本,后配置的覆盖先配置的

可选依赖:指对外隐藏当前所依赖的资源不透明,隐藏后不具有依赖的传递性

<dependency>
	<groupId>junit</groupId>
	<artifactId>junit</artifactId>
	<version>4.12</version>
	<optional>true</optional><!--true就代表开启可选依赖,默认false-->
</dependency>

排除依赖: 指主动断开依赖的资源,被排除的资源无需指定版本。

比如说项目 A 依赖了项目 B,项目 B 依赖了项目 C,项目 A 如果不需要项目 C,就排除项目 C 这个依赖

即 A---depend-->B-----depend---->C 变成 A----depend--->B

就在 A 的 pom.xml 文件中写下要排除的依赖坐标。

<dependency>
	<exclusions>	
		<exclusion>
            <!--要排除的指定依赖坐标,不需要指定版本-->
		</exclusion>
	</exclusions>
</dependency>

4.3 依赖范围

在配置依赖的坐标中有一个scope 标签用来配置依赖的作用范围

<dependency>
	<groupId>junit</groupId>
	<artifactId>junit</artifactId>
	<version>4.12</version>
	<scope></scope>
</dependency>

依赖的作用范围分为三种:

  1. 主程序范围有效(main文件夹范围内)
  2. 测试程序范围内有效(test文件夹范围内)
  3. 是否参与打包(package指令范围内)

scope 的四个值对应依赖作用范围如下图所示:

2953321-20240709222238956-823264722.png

带有依赖范围的资源在进行依赖传递时,依赖的作用范围会收到影响,如下图所示:

2953321-20240709222238980-1890991021.png

五,Maven的生命周期与插件

5.1 Maven生命周期

Maven 构建生命周期描述的是一次构建过程经历经历了多少个事件。

Maven 对项目构建的生命周期划分为 3 套:

  • clean:清理工作
  • default:核心工作,例如编译,测试,打包,部署等。
  • site:产生报告,发布站点等。

clean 生命周期

  • pre-clean:执行一些需要在 clean 之前完成的工作

  • clean:移除所有上一次构建生成的文件

  • post-clean:执行一些需要在 clean 之后立刻完成的工作

default 构建生命周期

  • validate (校验):校验项目是否正确并且所有必要的信息可以完成项目的构建过程

  • initialize (初始化):初始化构建状态,比如设置属性值.

  • generate-sources( 生成源代码):生成包含在编译阶段中的任何源代码

  • process-sources(处理源代码):处理源代码,比如说,过滤任意值。

  • generate-resources (生成资源文件):生成将会包合在项目包中的资源文件

  • process-resources (处理资源文件):复制和处理资源到目标目录,为打包阶段最好准备。

  • compile (编译):编译项目的源代码。

  • process-classes(处理类文件):处理编译生成的文件,比如说对 Java class 文件做字节码改善优化

  • generate-test-sources ( 生成测试源代码):生成包含在编译阶段中的任何测试源代码

  • process-test-sources (处理测试源代码):处理测试源代码,比如说,过滤任意值.

  • generate-test-resources ( 生成测试资源文件):为测试创建资源文件。

  • process-test-resources (处理测试资源文件):复制和处理测试资源到目标目录

  • test-compile (编译测试源码):编译测试源代码到测试目标目录

  • process-test-classes (处理测试类文件):处理测试源码编译生成的文件。

  • test(测试):使用合适的单元测试框架运行测试 (Juint 是其中之一)。

  • prepare-package(准备打包 ):在实际打包之前,执行任何的必要的操作为打包做准备。

  • package(打包):将编译后的代码打包成可分发格式的文件,比如 JAR、WAR 或者 EAR 文件

  • pre-integration-test (集成测试前):在执行集成测试前进行必要的动作。比如说,搭建需要的环境。

  • integration-test(集成测试):处理和部署项目到可以运行集成测试环境中。

  • post-integration-test (集成测试后):在执行集成测试完成后进行必要的动作。比如说,清理集成测试环境

  • verify:运行任意的检查来验证项目包有效且达到质量标准

  • install (安装):安装项目包到本地仓库,这样项目包可以用作其他本地项目的依赖

  • deploy(部署):将最终的项目包复制到远程仓库中与其他开发者和项目共享

site 构建生命周期

  • pre-site: 执行一些需要在生成站点文档之前完成的工作
  • site: 生成项目的站点文档
  • post-site: 执行一些需要在生成站点文档之后完成的工作,并且为部署做准备
  • site-deploy: 将生成的站点文档部署到特定的服务器上,即将你的jar包发布到你设置好的maven私服之中。

Maven 的生命周期假设执行了 test 阶段,那么会从 validate 阶段开始一直到 test 阶段都执行一次。

5.2 Maven的插件

插件

  • 插件与生命周期内的阶段绑定,在执行到对应生命周期时执行对应的插件功能
  • 默认maven在各个生命周期上绑定有预设的功能
  • 通过插件可以自定义其他功能

即通过插件完成对应生命周期所需要完成的事情。

举例:导入 source 插件将源代码打包为 jar 包

            <plugin>
                <!--插件的坐标,具体看maven官网-->
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-source-plugin</artifactId>
                <version>3.3.0</version>
                <!--插件是如何执行的-->
                <executions>
                    <!--插件具体执行内容-->
                    <execution>
                        <!--插件在具体某个生命周期中执行-->
                        <phase>generate-resources</phase>
                        <!--不是每一个插件都有这个功能,这里是指代打包为jar包-->
                        <goals>
                            <goal>jar</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>

插件的具体用法直接查找 maven 官网即可。

动物装饰