maven简介

https://www.bilibili.com/video/BV1uApMeWErY?spm_id_from=333.788.videopod.sections&vd_source=b0128143be22d1783a42f5fbf34d9d25

pom.xml

image-20250413165827744

定义了项目的配置、依赖、插件、以及构建的过程

Maven仓库

就是存放jiar包的地方,按照作用范围可以分为

  1. 本地仓库

    • 就是电脑上的本地目录,默认在image-20250413170307522

      一定要是一个没有中文的路径下。

  2. 远程仓库

    • 一般是一个公司或者组织内部搭建的一个仓库,用来给内部的项目提供统一的依赖管理,避免jar包的重复下载
    • 也可以通过中央仓库下载,是Maven官方维护的一个仓库 ,开源jar包都可以在这里找到
  3. 私服

maven安装和下载

Maven官网:https://maven.apache.org/

Maven下载地址:https://maven.apache.org/download.cgi

Nexus下载地址:https://help.sonatype.com/en/download.html

环境变量:image-20250413171625778

再在path里添加%MAVEN_HOME%\bin

在cmd里输入mvn -v出现就成功

image-20250413171717573

然后找到image-20250413171820128

配置本地仓库

这个是maven的配置文件,先找到localRepository也就是本地仓库这个标签

1
2
3
4
5
6
7
<!-- 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>D:\Java\LocalMavenRepository</localRepository>

配置中央仓库

由于中央仓库的镜像都是在国外,所以需要一个国内的镜像加速下载

找到结束标签,将以下代码贴在其前面。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<mirror>
<id>maven-default-http-blocker</id>
<mirrorOf>external:http:*</mirrorOf>
<name>Pseudo repository to mirror external repositories initially using HTTP.</name>
<url>http://0.0.0.0/</url>
<blocked>true</blocked>
</mirror>
<!--配置阿里远程仓库-->
<mirror>
<id>alimaven</id>
<name>aliyun maven</name>
<url>http://maven.aliyun.com/nexus/content/groups/public/</url>
<mirrorOf>central</mirrorOf>
</mirror>
</mirrors>

配置JDK属性

标签中进行配置,一定要小心,找到结束标签,在其前面配置以下代码。因为在标签中全部是注释,粘到哪里都在注释中,只有找到结束标签前才是注释外的,配置才会生效。

21就全改成21

1
2
3
4
5
6
7
8
9
10
11
12
13
<profile>
<id>jdk17</id>
<activation>
<activeByDefault>true</activeByDefault>
<jdk>17</jdk>
</activation>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<maven.compiler.source>17</maven.compiler.source>
<maven.compiler.target>17</maven.compiler.target>
<maven.compiler.compilerVersion>17</maven.compiler.compilerVersion>
</properties>
</profile>

初识Maven

这是一个官方提供的快速开始模板创建指令

1
mvn archetype:generate -DgroupId=com.mycompany.app -DartifactId=my-app -DarchetypeArtifactId=maven-archetype-quickstart -DarchetypeVersion=1.5 -DinteractiveMode=false

DgroupId:项目的组织id,一般是一个公司或者组织的唯一标识,比较常用的是域名反过来写

DartifactId:是项目的唯一标识,一般是项目的工程名字

DarchetypeArtifactId:maven为我们提供的各种不同类型的项目结构,保持默认就行

windows这几个配置信息需要加双引号,否则可能会报错

在idea中使用maven

打开idea2023,具体步骤如下:

  1. File—>settings—>Build,Execution,Depolyment—>Build Tools—>Maven

Maven home path(Maven工具所在的目录,bin的上一级目录): D:\apache-maven-3.9.6

勾选Override选项
User settings file(Maven工具的核心配置文件): D:\apache-maven-3.9.2\conf\settings.xml
Local repository(本地仓库,antlr的上一级目录): D:\repository(只要在settings.xml里面写上了本地的路径,就会自动配置)

  1. Maven—>Importing—>配置JDK的版本
  2. Runner

VM Options:-DarchetypeCatalog=internal (在新建模块时使用本地模板)
JRE: 17

  1. Repositories(刷新本地仓库的索引): 选中本地仓库,点Update

生命周期和插件

在右侧可以打开maven界面,在lifecycle里就是生命周期的插件

  • 双击clean可以清理一些东西
  • validate:用来验证项目是否正确,并且所有必要信息是可用的,如果有问题就会报错
  • compile:用来编译原项目的代码,也就是把java的源码文件编译成字节码文件
  • test就是单元测试,把单元测试用例都执行一遍
  • package的作用是打包项目和其他的资源文件,生成一个jar包或者war包,但也会先编译执行一下看看有没有问题
  • verify是用来验证打包的结果,也就是检查生成的jar包是否正确,不常用
  • install把项目打包后生成的jar包或者war安装到本地仓库中,也就是配置文件里的那个路径
  • site是用来生成项目的站点文档,生成一个静态网站
  • deploy的作用是把打包的jar上传到远程仓库里,一般是发布到公司内部的私服仓库

maven的坐标和本地仓库的存储位置

maven的坐标是唯一标识,由三部分组成

1
2
3
4
5
<goupId>junit</goupId>公司组织唯一标识
<artifactId>junit</artifactId>项目唯一标识
<version>3.8.1</version>项目的版本号
<scope>test</scope>
版本号也会分为SNAPSHOT和RELEASE两种,也就是快照版和正式版,快照版是开发过程中不稳定的版本,正式版是一个稳定的发行版本

找到本地仓库的位置,然后会有junit,里面找到版本,再找到jar包,通过有个网站叫mvnrepository,里面收录了几乎所有的jar包,搜索想要的jar包,里面会有很多的版本,选择稳定的版本,在下方就可以看到jar包的坐标,点击一下就可以复制,然后粘贴到dependency标签里就可以了,如果爆红了就说明本地仓库没有这个jar包,只需要下载到这里就可以,方法是点击右上Maven的刷新按钮就可以了

依赖管理

依赖范围

scope标签可以 指定依赖的范围,常见的范围有compile,provided,runtime,test等等

  1. compile就是指这个依赖是编译和运行时都需要的,也是默认范围可以省略不写,比如jdbc

  2. provided是指定这个依赖是编译时需要但是运行时不需要的,比如经常使用的lombok

  3. runtime是指定这个依赖是运行时需要的但编译时不需要,比如jdbc驱动的jar包

  4. test指在测试的时候需要,在正式的业务代码中并不需要,也无法使用相关的类和方法,不会被打包到最终的jar包中,比如junit的测试框架

  5. 还有一个system的依赖范围是表示这个依赖是在本地的文件系统中提供的,如果依赖范围指定为system的话,必须要同时提供一个systempath的标签,用来指定这个依赖的具体位置,这个不推荐使用因为可移植性差

    1
    2
    3
    <scope>system</scope>
    <systemPath>${basedir}/lib/junit-3.8.1.jar</systemPath>
    lib目录专门存放本地的jar包,然后加上junit这个包的文件全名
  6. import范围,一般是在dependdencyManagement中使用,作用是导入其他pom文件中的依赖,但是并不会实际引入依赖,只是用来管理依赖的版本号

添加依赖

在mvnrepository这个网站上搜索并找到这些依赖的坐标,再添加到pom.xml就可以了

依赖传递

直接写在pom.xml文件中的依赖叫做直接依赖,而当这个直接依赖又依赖了其他的jar包的时候,这些依赖的jar包被叫做间接依赖

maven会自动解析这些依赖关系,并下载相关jar包,只需要告诉maven直接依赖是什么,他会自动下载间接依赖,这就是依赖传递

另外只有依赖范围是compile的依赖才会被传递,其他的依赖范围是不会传递的

依赖冲突

依赖传递是非常方便的,但也会有个问题是依赖冲突,比如在项目里面添加了两个不同的依赖,它们又依赖了不同版本的同一个jar包的话,就会出现依赖冲突的问题,也就是到底应该使用哪一个版本的jar包的问题。

Maven会根据一定的规则来解决这个冲突

  1. 第一个规则是最短路径优先,也就是当依赖中出现相同的资源时,路径最短的那个依赖会被优先使用
  2. 第二个规则是先声明优先,也就是当路径层级相同时,在pom.xml里面配置顺序靠前的依赖,就会被优先使用

父子工程

新建一个maven,在pom.xml找到

1
<packaging>jar</packaging>

这也就是打包方式,可以是jar、war、pom,jar打包java,war打包web,pom不会生成jar和war包,而是用来管理其他子工程的

我们创建一个module文件,发现里面多了一个

1
2
3
4
5
<parent>
<groupId>org.example</groupId>
<artifactId>maven_parent</artifactId>
<version>1.0-SNAPSHOT</version>
</parent>

这个标签就是指定了它的父工程坐标

image-20250414163219089

点击可以直接定位到父工程坐标,在父工程的pom里也多了一些这个,里面列出了所有子模块,我们叫做聚合,通过聚合的方式管理多个子模块,通过父工程一次性管理子模块,也可以点击父工程的m去定位到子模块

1
2
3
<modules>
<module>child-a</module>
</modules>

手动解决依赖冲突

大概意思是不同的模块去使用相同的jar但版本号不一样,通过最短路径和先声明原则会被使用其中一个,而我们就想用不一样的版本就需要手动解决

第一种是在模块a里排除模块b的依赖,在模块a的pom.xml文件里面找到模块b的依赖,添加

1
2
3
4
5
6
<exclusions>
<exclusion>//这里面是指定要排除的那个依赖的坐标
<groupId>xxx</groupId>
<artifactId>xxx</artifactId>排除的时候不需要版本号,是把这个jar包所有的版本都排除
</exclusion>
</exclusions>

添加完后再重启一下看看

第二种是在模块b的pom文件里面找到那个jar包比如jdbc的依赖位置,添加

1
2
3
4
5
6
7
8
9
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>3.8.1</version>
<scope>test</scope>
<optional>true</optional>表示这个是可选的
</dependency>

依赖继承

在父工程添加一下公共依赖,这样子模块不需要添加依赖就可以继承,并且不会被依赖范围是compile以外的选项影响,就是不管怎么样都会被继承

但在实际开发中很少这样做,因为耦合性太高,就可以在父模块用依赖管理标签,这样子模块不会自动继承父模块的依赖了

1
2
3
4
5
<dependencyManggement>
<dependencies>
xxxx
</dependencies>
</dependencyManggement>

然后再去子模块添加想要用的依赖

properties标签可以定义一些公共的属性,比如版本号,需要后续修改的话也是修改这里

然后在对应版本的位置写${spring.version}就可以使用

1
2
3
4
5
6
7
8
9
10
11
<properties>
<spring.version>6.1.11</spring.version>
</properties>

<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>${spring.version}</version>
<scope>test</scope>
</dependency>

nexus私服仓