关于Maven,你真的了解它吗?(上)

简介: 关于Maven,你真的了解它吗?(上)

编译软件:IntelliJ IDEA 2019.2.4 x64

操作系统:win10 x64 位 家庭版

Maven版本:apache-maven-3.6.3

一. Maven有哪些核心概念?

1.1 Maven中的POM

释义:

POM,英文全称为Project Object Model,意思是项目对象模型,就是将项目封装为对象模型,便于开发者使用Maven管理构建项目

常见POM标签:

代码示例如下

<?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">
     //设置父工程坐标    
    <parent>
        <artifactId>maven_test</artifactId>
        <groupId>com.bd</groupId>
        <version>1.0-SNAPSHOT</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>
    <artifactId>maven_makefriend</artifactId>
  //引入依赖(子工程的jar包或第三方库库)的坐标 
    <dependencies>
        <dependency>
            <groupId>com.bd</groupId>
            <artifactId>maven_make</artifactId>
            <version>1.0-SNAPSHOT</version>
        </dependency>
        <dependency>
            <groupId>com.bd</groupId>
            <artifactId>maven_hellofriend</artifactId>
            <version>1.0-SNAPSHOT</version>
        </dependency>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.12</version>
            //定义依赖范围
            <scope>test</scope>
        </dependency>
    </dependencies>
</project>

1.2 Maven约定的目录结构

详细目录结构如下所示:

1.3 Maven生命周期

Maven生命周期:

按照一定的顺序执行各个命令的过程

Maven生命周期包含以下三个部分组成:

  • Clean LifeCycle在进行真正的项目构建之前进行的一些清理工作。
  • Default LifeCycle项目构建的核心步骤包括编译,测试,打包,安装,部署等步骤。

注意:

当你点击“install”时,前面会自”ccompile“依次按顺序执行到install时【红框中的步

骤】,install才 会执行安装,它不是点击”install“就会直接执行安装步骤。执行clean

时,它只会清除IDEA中maven模块 下的target目录,而不会删除安装在本地的jar包, 除非你手动删除。

  • Site LifeCycle生成项目报告,站点,发布站点

附注:

以上三个生命周期彼此之间互不干涉,相互独立。每个生命周期阶段都由一个或多个插件目标组成。通过在 pom.xml文件中绑定插件和目标到生命周期阶段上,就可以使用一条命令来自动化执行所有构建任务。

1.4 Maven的插件和目标

  • 插件:它的本质是由jar包配置文件组成,如下图所示
    例如插件maven-clean-plugin的构成如下:

  • 目标每个插件都能实现多个功能,而每个功能就是一个插件目标。
    例如:compile就是插件maven-compiler-plugin的一个功能;pre-clean是插件
    maven-cean-plugin的一个目标。

1.5 Maven中的仓库

仓库的分类:

  • 本地仓库为当前计算机提供maven服务
  • 远程仓库为其他计算机也可以提供maven服务
  • 私服:架设在当前局域网环境下,为当前局域网范围内的所有Maven工程服务。
  • 中央仓库:架设在Internet.上,为全世界所有Maven工程服务。
  • 中央仓库的镜像:架设在各个大洲,为中央仓库分担流量。减轻中央仓库的压力,同时更快的响应用户请求。

仓库中存放的文件类型(以jar包为主):

  • Maven的插件
  • 第三方框架或工具的jar包
  • 自己研发的项目或模块

1.6 Maven的坐标

作用:

使用坐标引入jar包

坐标是如何构成?

由g-a-v构成

g --> groupld公司或组织的域名倒序+当前项目名称

a --> artifactld当前项目的模块名称

v --> version当前模块的版本

pom.xml中相关代码示例如下:

<parent>
    <artifactId>maven_demo</artifactId>
    <groupId>com.bd</groupId>
    <version>1.0-SNAPSHOT</version>
</parent>

注意:

g-a-v本地仓库jar包的位置

a-vjar包的全名

如何寻找相应jar包的坐标?

自己一个个在网上搜索?不不,效率太低了!

我们可以到 https://mvnrepository.comhttps://central.sonatype.com 去查找相应jar包的坐标

如何使用上述两个网站去搜索?

https://mvnrepository.com中搜索junit 的jar包的坐标为例

①在搜素栏输入你要找的jar包名称,然后点击”Search“,在搜索结果找 ”usages“

最多的那一栏(往往有我们需要的资源),然后点击访问它

②找对应版本的jar包的坐标引用资源,没有找到的话就回退第①步找下一个”usages“对应的资源栏

③找到对应版本的jar包名称,以然后点进去(我这里以 junit 5.9.2版本为例),复制Maven栏下的代码(坐标引用内容)

④将复制的代码粘贴到你要应用的模块中的pop.xml文件里的<dependencies></dependencies>标签内,IEDA会自动在镜像服务器中下载该版本的jar包资源


二. Maven的依赖管理是什么?

Maven中的依赖是什么?

在 Maven 中,依赖(Dependency)是指项目需要的外部 JAR 文件或其他库。而依赖管理就是指在 Maven 中为项目定义和管理依赖关系的过程。

为什么要进行依赖管理?

通过使用依赖管理,Maven可以管理所有需要的 JAR和其他库,并确保它们可以正确下载并与本地项目一起工作。可能会存在多个依赖项依赖同一个第三方库的不同版本的场景,这时候需要根据项目需要的版本来选择合适的依赖项版本,避免因版本冲突导致的问题。

2.1 依赖范围

依赖语法:

<scope></scope>

可以在 <scope> 元素中使用以下值:

  1. compile:默认值,表示依赖项在编译、测试和运行期间都可用。
  2. provided表示依赖项在编译和测试期间可用,但是在运行时由容器或环境提供。
  3. runtime表示依赖项在运行时可用,但不需要在编译时和测试时可用。
  4. test表示依赖项仅在测试代码和源代码(即 src/test/ 目录)中使用,而不包括主要应用程序代码和资源。
  5. system表示依赖项类似于 provided,但从本地系统文件系统中获得依赖项,而不是从 Maven 仓库下载。 需要通过<systemPath> 指定依赖项的路径。

常用compile,test,provided的作用域范围:

  • compile在main目录下、test目录下、Tomcat【服务器】下均有效。
  • test只能在test目录下有效。
  • provided在main、test目录下均有效,Tomcat【服务器】无效。

2.2 依赖的传递性

什么是依赖的传递性?

当多个项目导入依赖时,Maven会自动处理依赖项之间的关系并保证项目的顺利构建。当定义项目中的依赖项时,它会自动查找依赖项的依赖项,并将其添加到 build path 中。这就是所谓的依赖项传递性,因为它涉及到一系列相互依赖的库之间的自动传递。

例如,如果你在项目中使用 Spring 框架,而Spring Framework 本身就有多个依赖项,如 Spring Core,Spring Beans 和 Spring Context 等。但是,你不需要在 Maven 文件中分别指定所有这些依赖项 - 只需仅提供对 Spring Framework 依赖的声明即可。然后,Maven 就会自动解决 Spring Framework 以及其所有依赖项的传递性,将它们引入到项目构建路径中。

那么Maven是如何查找项目中依赖项的依赖项,进而自动引入到项目构建路径?或者说根据什么原则来处理依赖项之间的关系去构建项目?

有两条原则:

  1. 路径最短者优先【就近原则】

案例:在maven_test项目中定义三个maven模块(maven_makefriend,maven_make与maven_hellofriend),其中模块maven_hellofriend引入log4j 1.2.14的jar包,maven_make引入log4j 1.2.17的jar包,maven_makefriend模块不引入log4j 的jar包;另外,模块maven_hellofriend要依赖于模块maven_make,模块maven_makefriend依赖于模块maven_hellofriend,观察思考模块maven_makefriend会应用哪个版本的log4j
的jar包?

①模块maven_make引入log4j 1.2.17的jar包并install至Maven的本地仓库中 代码示例如下:

<?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">
    <parent>
        <artifactId>maven_test</artifactId>
        <groupId>com.bd</groupId>
        <version>1.0-SNAPSHOT</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>
    <artifactId>maven_make</artifactId>
    <dependencies>
        <!-- https://mvnrepository.com/artifact/log4j/log4j -->
        <dependency>
            <groupId>log4j</groupId>
            <artifactId>log4j</artifactId>
            <version>1.2.17</version>
        </dependency>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.12</version>
            <scope>test</scope>
        </dependency>
    </dependencies>
</project>

②在模块maven_hellofriend引入log4j 1.2.14的jar包以及模块maven_make的jar包

代码示例如下:

<?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">
    <parent>
        <artifactId>maven_test</artifactId>
        <groupId>com.bd</groupId>
        <version>1.0-SNAPSHOT</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>
    <artifactId>maven_hellofriend</artifactId>
    <dependencies>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.12</version>
            <scope>test</scope>
        </dependency>
        <!-- https://mvnrepository.com/artifact/log4j/log4j -->
        <dependency>
            <groupId>log4j</groupId>
            <artifactId>log4j</artifactId>
            <version>1.2.14</version>
        </dependency>
    //引入模块maven_make的jar包
        <dependency>
            <groupId>com.bd</groupId>
            <artifactId>maven_make</artifactId>
            <version>1.0-SNAPSHOT</version>
        </dependency>
    </dependencies>

③ 模块maven_makefriend依赖于模块maven_hellofriend,在pop.xml中引入其jar包

<?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">
    <parent>
        <artifactId>maven_test</artifactId>
        <groupId>com.bd</groupId>
        <version>1.0-SNAPSHOT</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>
    <artifactId>maven_makefriend</artifactId>
    <dependencies>
    //引入模块maven_hellofriend的jar包
        <dependency>
            <groupId>com.bd</groupId>
            <artifactId>maven_hellofriend</artifactId>
            <version>1.0-SNAPSHOT</version>
        </dependency>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.12</version>
            <scope>test</scope>
        </dependency>
    </dependencies>
</project>

相关文章
|
8月前
|
数据可视化 Java 项目管理
|
8月前
|
存储 Java Maven
|
9月前
|
Java 数据库连接 Maven
Maven介绍
Maven介绍
45 0
|
5月前
|
Java Maven
maven 使用小技巧
maven 使用小技巧
19 0
|
6月前
|
Java 测试技术 Maven
maven总结
maven总结
20 0
|
7月前
|
Java 应用服务中间件 Linux
01Maven - Mave介绍
01Maven - Mave介绍
20 0
|
8月前
|
Java Maven
|
8月前
|
Java 测试技术 Maven
|
11月前
|
Java 应用服务中间件 Apache
零基础快速理解Maven
零基础快速理解Maven
|
12月前
|
存储 IDE Java