Maven基础

108 阅读10分钟

一,Maven概述

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

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

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

Maven的关系图:

image

Maven的作用:

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

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

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

    Maven的统一java项目图:

    image

二,Maven安装与配置

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

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

如下图:

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

image

Maven文件夹说明:

image

Maven环境变量配置:

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

  2. 配置MAVEN_HOME,值是maven的安装路径

    image

  3. 配置path,填入:%MAVEN_HOME%\bin

    image
    1. 在cmd中使用mvn来测试是否配置成功。

      配置成功效果如下图:

      image

    2. Maven本地仓库配置

      在Maven安装路径中的conf文件夹中的settings.xml文件中编辑

      image

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

      image

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

      image

      	<!-- 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项目目录结构如下:

image-20230727153956570

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的四个值对应依赖作用范围如下图所示:

image-20230727165151961

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

image-20230727165509285

五,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官网即可。