Maven

作者: 裂开的汤圆 | 来源:发表于2020-10-15 02:58 被阅读0次

Maven基础

1.通过修改settings.xml文件,可以为maven添加镜像加速服务,也可以修改默认的本地仓库位置等。
该文件的默认路径为

Maven安装路径\conf\settings.xml

2.当执行Maven命令需要用到某些插件时,Maven会先到本地仓库中查找,如果在本地仓库中找不到,则会联网到中央仓库下载。
本地仓库的默认位置为

[系统中当前用户的家目录]\.m2\repository

// 例如windos下为
C:\Users\wbin3\.m2\repository
// linux下为
/home/wbin3/.m2/repository

3.maven构建的各个环节

  • 清理: 将以前编译得到的旧的class字节码文件删除,为下一次编译做准备
  • 编译: 将.java文件编译成.class字节码文件
  • 测试: 自动测试,自动调用junit程序
  • 报告: 测试程序执行的结果
  • 打包: 动态Web工程打war包,Java工程打jar包
  • 安装: Maven特定的概念,将打包得到的jar文件,复制到“仓库”中的指定位置
  • 部署: 将动态Web工程生成的war包复制到Servlet容器的指定目录下,使其可以运行

常用命令

mvn clean:清理
mvn compile: 编译
mvn test-compile: 编译测试程序
mvn test: 执行测试
mvn package:打包
mvn install: 安装
mvn deploy: 自动部署

坐标

  • 在Maven中使用以下三个标识,在仓库中唯一定位一个Maven工程
<groupid>: 公司或组织域名倒叙+项目名
<groupid>:com.arcc.maven</groupid>

<artifactid>: 模块名
<artifactid>demo</artifactid>

<version>:版本号
<version>1.0.0</version>
  • Maven工程与仓库中路径的对应关系
// 现在有这么一个坐标
<groupid>:com.arcc.maven</groupid>
<artifactid>demo</artifactid>
<version>1.0.0</version>

// 那么它在仓库中的路径为
com/arcc/maven/demo/1.0.0/demo-1.0.0.jar

仓库

  • 本地仓库:当前电脑上部署的仓库目录,为当前电脑上所有Maven工程服务
  • 远程仓库:
    -- 私服: 搭建在局域网环境中,为局域网范围内的所有Maven工程服务


    私服

-- 中央仓库: 架设在Internet上,为全世界所有Maven工程服务
-- 中央仓库的镜像:架设在各大洲,为中央仓库分担流量,减轻中央仓库压力,例如阿里云就提供了Maven的镜像服务。

依赖【初级】

1.Maven解析依赖信息时会先到本地仓库中查找被依赖的jar包,如果本地仓库中找不到,会到中央仓库中查找。
2.对于我们自己开发的Maven工程,使用mvn install命令安装后就可以将该项目打包成Jar包放入本地仓库中
3.Maven在导入依赖的Jar包时,会自动将该Jar包的所需依赖的Jar包一并导入。例如在导入spring-core.Jar时,因为spring-bore.jar依赖于commons-logging.jar,所以maven会将commons-logging.jar包一并导入到项目中

4.依赖的范围:

// 首先看一下下面这段xml
<dependencies>
    <dependency>
        <groupId>junit</groupId>
        <artifactId>junit</artifactId>
        <version>4.0</version>
        <scope>test</scope>
    </dependency>

    <dependency>
        <groupId>com.arcc.maven</groupId>
        <artifactId>Hello</artifactId>
        <version>0.0.1-SNAPSHOT</version>
        <scope>compile</scope>
    </dependency>
</dependencies>

其中<scope>标签标示的就是依赖的范围,主要有compile(编译范围)、test(测试范围)以及provided(生产范围)。

上面这段xml,第一段<dependency>的意思是指,引入junit包,依赖范围为测试范围。意思是,只有当执行mvn test命令时,才会将junit包导入到项目。
而第二段<dependency>的意思是指引入Hello包,依赖范围为编译范围,当执行mvn compile命令时,会导入hello包。

三种依赖范围在执行不同mvn命令时,是否会导入相关范围内依赖的jar包,如下图所示

image.png

这里需要注意,什么情况下会用到provided依赖范围,上图中可以看到,provided依赖范围的jar包不参与到打包,但是将打包好的项目部署到服务器上时,又能正常运行。说明服务器上提供了该jar包,例如tomcat本身提供了servlet-api.jar包,当我们项目中需要用到这些jar包时,便可把他们的依赖范围声明为<scope>provided</scope>。

依赖【高级】

  1. 依赖的传递性

可以传递的依赖不必在每个Maven项目中都重复声明,在依赖最底层的工程中声明一次即可。
例如项目A->B(A依赖于B),那么我们只需要在项目B中申明即可。
需要注意的是非compile范围的依赖不能传递。

2.依赖的排除
使用以下标签可以排除指定的Jar包
现在有两个项目A、B,且A->B(A依赖于B)。我们在A项目中添加了下面的标签,那么A项目中会将该jar包排除,但是B项目不会排除该jar包。
那么如果现在有三个项目,A->B->C。我们在B项目中添加了<exclusions>标签,那么A项目中也不会导入该Jar包。

<dependency>
    ...
    <exclusions>
        <exclusion>
            <groupId>commons-logging</groupId>
            <artifactId>commons-logging</artifactId>
        </exclusion>
    </exclusions>
</dependency>

3.依赖的引用优先级

  • 路径最短者优先
    下图有三个项目,MakeFriends项目依赖于HelloFriend,HelloFriend依赖于Hello。
    由于项目需要Hello项目导入了log4j.1.2.17.jar,而HelloFriend项目导入了log4j.1.2.14.jar。
    根据依赖的传递性,MakeFriends项目中会同时存在log4j.1.2.14和log4j.1.2.17。
    当出现上述情况,Maven会选择路径最短的Jar包,HelloFriend距离MakeFriends为1,而距离Hello为2,所以Maven会选择log4j.1.2.14作为MakeFriends项目的jar包。


    image.png
  • 路径相同时,先声明者优先,声明是指<dependency>标签的声明顺序。

image.png

使用<properties>标签定义变量

  • 首先使用<properties>标签定义统一声明变量
  • 然后在需要使用的位置,使用${自定义标签名}引用申明的变量

用法如下:

<properties>
    <junit.version>1.0.0</junit.version>
</properties>

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

继承

场景:
现在有三个项目A、B、C,A依赖于B,B依赖于C。
A依赖的junit为4.0
B依赖的junit为4.0
C依赖的junit为4.9
这是由于test范围的依赖不能传递,导致的各个项目中junit版本不一致,会对团队的协同工作带来影响。

解决思路:
将junit依赖版本统一提取到"父”工程中,在子工程中声明依赖时不指定版本,以父工程中统一设定的为准。

步骤:
1.创建一个Maven工程作为父工程。注意:打包方式为pom
2.在子工程中声明对父工程的引用
3.将子工程的坐标中与父工程坐标中重复的内容删除
4.在父工程中统一junit的依赖
5.在在工程中删除Junit依赖的版本号
6.配置继承后,执行安装命令时要先安装父工程

父工程pom.xml

<modelVersion>4.0.0</modelVersion>
<groupId>com.arcc.demo</groupId>
<artifactId>Parent</artifactId>
<version>0.0.1</version>
<packaging>pom</packaging>

// 配置依赖的管理
<dependencyManagement>
    <dependencies>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.0</version>
            <scope>test</scope>
        </dependency>
    </dependencies>
</dependencyManagement>

子工程pom,使用<parent>标签什么对父工程的依赖

<parent>
    <groupId>com.arcc.demo</groupId>
    <artifactId>Parent</artifactId>
    <version>0.0.1</version>
    // 使用relativePath标签什么父工程pom的相对路径。相对于当前pom文件的路径
    <relativePath>../Parent/pom.xml</relativePath>
</parent>

<dependencies>
    <dependency>
        <groupId>junit</groupId>
        <artifactId>junit</artifactId>
        <scope>test</scope>
    </dependency>
</dependencies>

聚合

在上述继承中,我们提到了一点,在配置继承后,执行安装命令时要先安装父工程。
这是由于如果不先安装父工程,在本地仓库中是找不到父工程的,会导致安装出错。

解决上述问题,可以采用以下配置,在父工程pom文件中配置<modules>标签,用于声明项目安装的顺序,这样就不会出现上述的问题。

父工程pom.xml

<modelVersion>4.0.0</modelVersion>
<groupId>com.arcc.demo</groupId>
<artifactId>Parent</artifactId>
<version>0.0.1</version>
<packaging>pom</packaging>

// 配置聚合,使用相对路径
<modules>
    <module>../Son1</module>
    <module>../Son2</module>
    ......
</modules>

// 配置依赖的管理
<dependencyManagement>
    <dependencies>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.0</version>
            <scope>test</scope>
        </dependency>
    </dependencies>
</dependencyManagement>

配置完成后,直接在父工程中使用mvn install命令,Maven会根据依赖关系,自动调整安装顺序,不需要指定安装的顺序。

自动化构建

可以通过配置<build>标签实现自动化部署的功能,不过企业中不常用,这里就不总结了。

补充

我们可以到http://mvnrepository.com搜索需要的jar包的依赖信息

相关文章

网友评论

      本文标题:Maven

      本文链接:https://www.haomeiwen.com/subject/diywpktx.html