biancheng-Maven依赖

目录http://c.biancheng.net/maven2/profile.html

1Maven简介
2Maven安装与配置
3Maven POM
4创建Maven项目
5Maven项目的构建与测试
6Maven坐标
7Maven依赖
8Maven仓库
9Maven生命周期
10Maven插件
11Maven导入本地jar包
12Maven site
13Maven Archetype
14Maven SNAPSHOT
15Maven自动化构建
16Maven依赖传递
17Maven排除依赖和可选依赖
18Maven继承
19dependencyManagement
20Maven聚合
21pluginManagement
22Maven Profile
23Maven镜像
24Maven私服
25Maven创建Web项目
26Eclipse配置Maven
27Eclipse新建Maven项目
28Eclipse导入Maven项目
29Eclipse执行Maven命令
30IDEA配置Maven
31IDEA新建Maven项目
32IDEA导入Maven项目
33IDEA执行Maven命令
34Maven自动化部署

Maven简介

Maven 能够帮助开发者完成以下任务:

  • 构建项目
  • 生成文档
  • 创建报告
  • 维护依赖
  • 软件配置管理
  • 发布
  • 部署


总而言之,Maven 简化并标准化了项目构建过程。它将项目的编译,生成文档,创建报告,发布,部署等任务无缝衔接,构建成一套完整的生命周期。

Maven 的目标

Maven 的主要目标是为为开发人员提供如下内容:

  • 一个可重复使用,可维护且易于理解的项目综合模型
  • 与此模型进行交互的工具和插件

约定优于配置

约定优于配置(Convention Over Configuration)是 Maven 最核心的涉及理念之一 ,Maven对项目的目录结构、测试用例命名方式等内容都做了规定,凡是使用 Maven 管理的项目都必须遵守这些规则。

Maven 项目构建过程中,会自动创建默认项目结构,开发人员仅需要在相应目录结构下放置相应的文件即可。

例如,下表显示了项目源代码文件,资源文件和其他配置在 Maven 项目中的默认位置。 

文件目录
Java 源代码 src/main/java
资源文件 src/main/resources 
测试源代码 src/test/java 
测试资源文件 src/test/resources
打包输出文件 target
编译输出文件 target/classes

Maven 的特点

Maven 具有以下特点:

    1. 设置简单。
    2. 所有项目的用法一致。
    3. 可以管理和自动进行更新依赖。
    4. 庞大且不断增长的资源库。
    5. 可扩展,使用 Java 或脚本语言可以轻松的编写插件。
    6. 几乎无需额外配置,即可立即访问新功能。
    7. 基于模型的构建:Maven 能够将任意数量的项目构建为预定义的输出类型,例如 JAR,WAR。
    8. 项目信息采取集中式的元数据管理:使用与构建过程相同的元数据,Maven 能够生成一个网站(site)和一个包含完整文档的 PDF。
    9. 发布管理和发行发布:Maven 可以与源代码控制系统(例如 Git、SVN)集成并管理项目的发布。
    10. 向后兼容性:您可以轻松地将项目从旧版本的 Maven 移植到更高版本的 Maven 中。
    11. 并行构建:它能够分析项目依赖关系,并行构建工作,使用此功能,可以将性能提高 20%-50%。
    12. 更好的错误和完整性报告:Maven 使用了较为完善的错误报告机制,它提供了指向 Maven Wiki 页面的链接,您将在其中获得有关错误的完整描述。

Maven安装与配置(图解)

1.Java 环境设置 

在 Java 官方网站 下载并安装 JDK 7.0 及以上版本,如果您不了解 JDK 的安装和配置,请参考:

2.下载 Maven

从 https://maven.apache.org/download.cgi 下载 Maven,这里我们以 Maven 3.6.3 为例。下载完成后,解压到合适的位置即可,本教程我们解压到 D:\apache-maven-3.6.3。

操作系统下载版本
Windows apache-maven-3.6.3-bin.zip
Linux apache-maven-3.6.3-bin.tar.gz
Mac OS apache-maven-3.6.3-bin.tar.gz

3.配置 Maven 环境变量

右键点击“计算机”图标,选择 "属性",然后点击 "高级系统设置",点击"环境变量"。

新建系统变量 MAVEN_HOME,变量值为 Maven 的安装目录 ,如下图。

 

 

编辑系统变量 Path,添加变量值:;%MAVEN_HOME%\bin,如下图。

 

 

在命令提示符下执行 mvn -version  ,输出结果如下图所示,证明 Maven 配置成功。

 

Maven POM

POM(Project Object Model,项目对象模型)是 Maven 的基本组件,它是以 xml 文件的形式存放在项目的根目录下,名称为 pom.xml。

POM 中定义了项目的基本信息,用于描述项目如何构建、声明项目依赖等等。

当 Maven 执行一个任务时,它会先查找当前项目的 POM 文件,读取所需的配置信息,然后执行任务。在 POM 中可以设置如下配置:

  • 项目依赖
  • 插件
  • 目标
  • 构建时的配置文件
  • 版本 
  • 开发者
  • 邮件列表


在创建 POM 之前,首先要确定工程组(groupId),及其名称(artifactId)和版本,在仓库中这些属性是项目的唯一标识。

POM 示例

  1. <project xmlns="http://maven.apache.org/POM/4.0.0"
  2. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  3. xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
  4. <modelVersion>4.0.0</modelVersion>
  5. <groupId>net.biancheng.www</groupId>
  6. <artifactId>maven</artifactId>
  7. <version>0.0.1-SNAPSHOT</version>
  8. </project>

创建 Maven 项目

下面我们将通过 maven-archetype-quickstart 原型,在 D:\maven 目录中创建一个基于 Maven 的 Java 项目。

打开命令行窗口,跳转到 D:\maven 目录,执行以下 mvn 命令。

  • ​mvn archetype:generate -DgroupId=net.biancheng.www -DartifactId=helloMaven -DarchetypeArtifactId=maven-archetype-quickstart -DinteractiveMode=false

参数说明:

    • -DgroupId: 项目组 ID,通常为组织名或公司网址的反写。
    • -DartifactId: 项目名。
    • -DarchetypeArtifactId: 指定 ArchetypeId,maven-archetype-quickstart 用于快速创建一个简单的 Maven 项目。
    • -DinteractiveMode: 是否使用交互模式。

目录及文件说明:

  • helloMaven:项目名,包含 src 文件夹和 pom.xml。
  • src/main/java:用于存放项目的 Java 文件。
  • src/main/resources:用于存放项目资源文件。
  • src/test/java:用于存放所有测试 Java 文件,如 JUnit 测试类。
  • src/test/resources :用于存放测试资源文件。
  • target:项目输出位置,用于存放编译后的文件。
  • pom.xml:Maven 项目核心配置文件。

Maven坐标

Maven 坐标

Maven 坐标一套规则,它规定:世界上任何一个构件都可以使用 Maven 坐标并作为其唯一标识,Maven 坐标包括 groupId、artifactId、version、packaging 等元素,只要用户提供了正确的坐标元素,Maven 就能找到对应的构件。 

任何一个构件都必须明确定义自己的坐标,这是 Maven 的强制要求,任何构件都不能例外。我们在开发 Maven 项目时,也需要为其定义合适的坐标,只有定义了坐标,其他项目才能引用该项目生成的构件。

以下是 helloMaven 项目的坐标定义。

  1. <project>
  2. <groupId>net.biancheng.www</groupId>
  3. <artifactId>helloMaven</artifactId>
  4. <packaging>jar</packaging>
  5. <version>1.0-SNAPSHOT</version>
  6. </project>


Maven 坐标主要由以下元素组成:

    • groupId: 项目组 ID,定义当前 Maven 项目隶属的组织或公司,通常是唯一的。它的取值一般是项目所属公司或组织的网址或 URL 的反写,例如 net.biancheng.www。
    • artifactId: 项目 ID,通常是项目的名称。
    • version:版本。
    • packaging:项目的打包方式,默认值为 jar。

Maven依赖

  1. <dependencies>
  2. <dependency>
  3. <groupId>javax.servlet</groupId>
  4. <artifactId>servlet-api</artifactId>
  5. <version>2.5</version>
  6. <scope>provided</scope>
  7. </dependency>
  8. </dependencies>

dependencies 元素可以包含一个或者多个 dependency 子元素,用以声明一个或者多个项目依赖,每个依赖都可以包含以下元素:

  • groupId、artifactId 和 version:依赖的基本坐标,对于任何一个依赖来说,基本坐标是最重要的,Maven 根据坐标才能找到需要的依赖。
  • type:依赖的类型,对应于项目坐标定义的 packaging。大部分情况下,该元素不必声明,其默认值是 jar。
  • scope:依赖的范围。
  • optional:标记依赖是否可选。
  • exclusions:用来排除传递性依赖。

Maven仓库(本地仓库+远程仓库)

仓库的分类

Maven 仓库可以分为 2 个大类:

  • 本地仓库
  • 远程仓库

当 Maven 根据坐标寻找构件时,它会首先查看本地仓库,若本地仓库存在此构件,则直接使用;若本地仓库不存在此构件,Maven 就会去远程仓库查找,若发现所需的构件后,则下载到本地仓库使用。如果本地仓库和远程仓库都没有所需的构件,则 Maven 就会报错。
远程仓库还可以分为 3 个小类:中央仓库、私服、其他公共仓库。

  • 中央仓库是由 Maven 社区提供的一种特殊的远程仓库,它包含了绝大多数流行的开源构件。在默认情况下,当本地仓库没有 Maven 所需的构件时,会首先尝试从中央仓库下载。
  • 私服是一种特殊的远程仓库,它通常设立在局域网内,用来代理所有外部的远程仓库。它的好处是可以节省带宽,比外部的远程仓库更加稳定。 
  • 除了中央仓库和私服外,还有很多其他公共仓库,例如 JBoss Maven 库,Java.net Maven 库等等。


Maven 仓库的分类如下图。

 

 

由于私服在实际开发中十分的常用,也特别重要,因此本节只稍做介绍,关于 Maven 私服的详细介绍请阅读 Maven 私服。

本地仓库

Maven 本地仓库实际上就是本地计算机上的一个目录(文件夹),它会在第一次执行 Maven 命令时被创建。

Maven 本地仓库可以储存本地所有项目所需的构件。当 Maven 项目第一次进行构建时,会自动从远程仓库搜索依赖项,并将其下载到本地仓库中。当项目再进行构建时,会直接从本地仓库搜索依赖项并引用,而不会再次向远程仓库获取。

Maven 本地仓库默认地址为 C:\%USER_HOME%\.m2\repository ,但出于某些原因(例如 C 盘空间不够),我们通常会重新自定义本地仓库的位置。这时需要修改 %MAVEN_HOME%\conf 目录下的 settings.xml 文件,通过 localRepository 元素定义另一个本地仓库地址,例如:

  1. <settings xmlns="http://maven.apache.org/SETTINGS/1.0.0"
  2. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  3. xsi:schemaLocation="http://maven.apache.org/SETTINGS/1.0.0
  4. http://maven.apache.org/xsd/settings-1.0.0.xsd">
  5. <localRepository>D:/myRepository/repository</localRepository>
  6. </settings>

构件只有储存在本地仓库中,才能被其他的 Maven 项目使用。构件想要进入本地仓库,除了从远程仓库下载到本地仓库外,还可以使用命令 mvn install 将本地项目的输出构件安装到本地仓库中。

中央仓库

中央仓库是由 Maven 社区提供的一种特殊的远程仓库,它包含了绝大多数流行的开源构件。在默认情况下,当本地仓库没有 Maven 所需的构件时,会首先尝试从中央仓库下载。

中央仓库具有如下特点:

  • 这个仓库由 Maven 社区管理
  • 不需要配置
  • 需要通过网络才能访问


我们可以通过 Maven 社区提供的 URL:http://search.maven.org/#browse,浏览其中的构件。中央仓库包含了绝大多数流行的开源 Java 构件及其源码、作者信息和许可证信息等。一般来说,Maven 项目所依赖的构件都可以从中央仓库下载到。

虽然中央仓库属于远程仓库的范畴,但由于它的特殊性,一般会把它与其他远程仓库区分开。我们常说的远程仓库,一般不包括中央仓库。

远程仓库

如果 Maven 在本地仓库和中央仓库中都找不到依赖的库文件,它就会停止构建过程并输出错误信息到控制台。为避免这种情况的发生,Maven 还提供了远程仓库的概念,它是一种由开发人员自己定制的仓库,其中包含了供其他项目使用的代码库或者构件。

  1. <project xmlns="http://maven.apache.org/POM/4.0.0"
  2. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  3. xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
  4. <modelVersion>4.0.0</modelVersion>
  5. <groupId>net.biancheng.www</groupId>
  6. <artifactId>maven</artifactId>
  7. <version>0.0.1-SNAPSHOT</version>
  8. <dependencies>
  9. <dependency>
  10. <groupId>com.bangcheng.common-lib</groupId>
  11. <artifactId>common-lib</artifactId>
  12. <version>1.0.0</version>
  13. </dependency>
  14. </dependencies>
  15. <repositories>
  16. <repository>
  17. <id>bianchengbang.lib1</id>
  18. <url>http://download.bianchengbang.org/maven2/lib1</url>
  19. </repository>
  20. <repository>
  21. <id>bianchengbang.lib2</id>
  22. <url>http://download.bianchengbang.org/maven2/lib2</url>
  23. </repository>
  24. </repositories>
  25. </project>

Maven 依赖搜索顺序

当通过 Maven 构建项目时,Maven 按照如下顺序查找依赖的构件。

  1. 从本地仓库查找构件,如果没有找到,跳到第 2 步,否则继续执行其他处理。
  2. 从中央仓库查找构件,如果没有找到,并且已经设置其他远程仓库,然后移动到第 4 步;如果找到,那么将构件下载到本地仓库中使用。
  3. 如果没有设置其他远程仓库,Maven 则会停止处理并抛出错误。
  4. 在远程仓库查找构件,如果找到,则会下载到本地仓库并使用,否则 Maven 停止处理并抛出错误。

Maven Archetype(原型/模板)

Maven Archetype 由下面 5 个模块组成:

  • maven-archetype-plugin:Archetype 插件。
  • archetype-packaging:用于描述 Archetype 的生命周期与构建项目软件包。
  • archetype-models:用于描述类与引用。
  • archetype-common:核心类。
  • archetype-testing:用于测试 Maven Archetype 的内部组件。

Maven SNAPSHOT(快照)

SNAPSHOT 是什么

SNAPSHOT(快照)是一种特殊的版本,它表示当前开发进度的副本。与常规版本不同,快照版本的构件在发布时,Maven 会自动为它打上一个时间戳,有了这个时间戳后,当依赖该构件的项目进行构建时,Maven 就能从仓库中找到最新的 SNAPSHOT 版本文件。

定义一个组件或模块为快照版本,只需要在其 pom.xml 中版本号(version 元素的值)后加上 -SNAPSHOT 即可,例如:

  1. <groupId>net.biancheng.www</groupId>
  2. <artifactId>helloMaven</artifactId>
  3. <packaging>jar</packaging>
  4. <version>1.0-SNAPSHOT</version>


要解决上面的问题,现在就十分简单了:data-servcie 团队每次更新代码都使用快照版本发布到仓库中,app-ui 团队则引用快照版本的依赖,这样 app-ui 不再需要重复修改 pom.xml 中的配置,每次构建时都会自动从仓库中获取最新的构件。

Maven依赖传递

依赖范围

首先,我们要知道 Maven 在对项目进行编译、测试和运行时,会分别使用三套不同的 classpath。Maven 项目构建时,在不同阶段引入到 classpath 中的依赖时不同的。例如编译时,Maven 会将与编译相关的依赖引入到编译 classpath 中;测试时,Maven 会将与测试相关的的依赖引入到测试 classpath 中;运行时,Maven 会将与运行相关的依赖引入到运行 classpath 中。

我们可以在 POM 的依赖声明使用 scope 元素来控制依赖与三种 classpath(编译 classpath、测试 classpath、运行 classpath )之间的关系,这就是依赖范围。

Maven 具有以下 6 中常见的依赖范围,如下表所示。

依赖范围描述
compile 编译依赖范围,scope 元素的缺省值。使用此依赖范围的 Maven 依赖,对于三种 classpath 均有效,即该 Maven 依赖在上述三种 classpath 均会被引入。例如,log4j 在编译、测试、运行过程都是必须的。
test 测试依赖范围。使用此依赖范围的 Maven 依赖,只对测试 classpath 有效。例如,Junit 依赖只有在测试阶段才需要。
provided  已提供依赖范围。使用此依赖范围的 Maven 依赖,只对编译 classpath 和测试 classpath 有效。例如,servlet-api 依赖对于编译、测试阶段而言是需要的,但是运行阶段,由于外部容器已经提供,故不需要 Maven 重复引入该依赖。
runtime  运行时依赖范围。使用此依赖范围的 Maven 依赖,只对测试 classpath、运行 classpath 有效。例如,JDBC 驱动实现依赖,其在编译时只需 JDK 提供的 JDBC 接口即可,只有测试、运行阶段才需要实现了 JDBC 接口的驱动。
system 系统依赖范围,其效果与 provided 的依赖范围一致。其用于添加非 Maven 仓库的本地依赖,通过依赖元素 dependency 中的 systemPath 元素指定本地依赖的路径。鉴于使用其会导致项目的可移植性降低,一般不推荐使用。
import 导入依赖范围,该依赖范围只能与 dependencyManagement 元素配合使用,其功能是将目标 pom.xml 文件中 dependencyManagement 的配置导入合并到当前 pom.xml 的 dependencyManagement 中。


依赖范围与三种 classpath 的关系一览表,如下所示。

依赖范围编译 classpath测试 classpath运行 classpath例子
compile log4j
test - - junit
provided - servlet-api
runtime - JDBC-driver
system - 非 Maven 仓库的本地依赖

Maven排除依赖和可选依赖

排除依赖 VS 可选依赖 

排除依赖和可选依赖都能在项目中将间接依赖排除在外,但两者实现机制却完全不一样。

    • 排除依赖是控制当前项目是否使用其直接依赖传递下来的接间依赖;
    • 可选依赖是控制当前项目的依赖是否向下传递;
    • 可选依赖的优先级高于排除依赖;
    • 若对于同一个间接依赖同时使用排除依赖和可选依赖进行设置,那么可选依赖的取值必须为 false,否则排除依赖无法生效。

依赖管理

Maven 可以通过 dependencyManagement 元素对依赖进行管理,它具有以下 2 大特性:

  • 在该元素下声明的依赖不会实际引入到模块中,只有在 dependencies 元素下同样声明了该依赖,才会引入到模块中。
  • 该元素能够约束 dependencies 下依赖的使用,即 dependencies 声明的依赖若未指定版本,则使用 dependencyManagement 中指定的版本,否则将覆盖 dependencyManagement 中的版本。

聚合

使用 Maven 聚合功能对项目进行构建时,需要在该项目中额外创建一个的聚合模块,然后通过这个模块构建整个项目的所有模块。聚合模块仅仅是帮助聚合其他模块的工具,其本身并无任何实质内容,因此聚合模块中只有一个 POM 文件,不像其他的模块一样包含 src/main/java、src/test/java 等多个目录。

插件管理

pluginManagement 元素与 dependencyManagement 元素的原理十分相似,在 pluginManagement 元素中可以声明插件及插件配置,但不会发生实际的插件调用行为,只有在 POM 中配置了真正的 plugin 元素,且其 groupId 和 artifactId 与 pluginManagement 元素中配置的插件匹配时,pluginManagement 元素的配置才会影响到实际的插件行为。

Maven自动化部署

自动化部署的实现方式

为了避免以上问题的发生,我们通常采用如下的架构来管理项目:

  • 版本控制工具(本节以 Git 为例):管理项目源代码
  • Maven:负责编译和发布项目
  • 远程仓库管理工具(本节以 Nexus 为例):管理构建生成的二进制文件


Maven 提供了一个名为 maven-release-plugin 的插件,它可以帮助我们实现 Maven 项目的自动化部署。

maven-release-plugin 提供了很多命令,其中最常用的是以下 4 个:

命令执行的操作
mvn release:clean 如果上次发布过程不成功,则使用该命令清理工作空间。
mvn release:rollback 若上一次发布过程不成功,回滚对代码和配置所做的更改。
mvn release:prepare
  • 检查是否存在任何未提交的本地更改。
  • 检查是否存在 SNAPSHOT 版本的依赖项。
  • 修改 POM 中的配置,将应用程序的版本从快照版本(SNAPSHOT)修改为正式版本(RLEASE),例如从从 1.0-SNAPSHOT 到 1.0。
  • 针对修改后的 POM 进行测试,确保一切正常。
  • 提交修改后的 POM。
  • 将正式版本的代码提交到 Git,并进行标记。
  • 修改 POM 中的配置,将正式版本升级为更高的快照版本(例如从 1.0 升级到 1.1-SNAPSHOT),以便以后继续使用快照版本进行开发。
  • 将修改后的 POM 提交到 Git。
mvn release:perform 从 Git 中检出上面标记的正式版代码,并执行命令 mvn deploy ,将正式版本的构件部署到 Nexus 中。

 

 

posted @ 2022-03-08 14:19  hanease  阅读(57)  评论(0编辑  收藏  举报