文章摘要: Java项目管理和构建工具。
相关信息
外部相关文章
- Maven官方依赖查询网站:Maven Repository
- 参考教程:黑马程序员B站视频
内部相关文章
- Java 8 编程语言:Language-Java-JavaSE-查询手册-JavaSE8
- Java 17 编程语言:Language-Java-JavaSE-查询手册-JavaSE21
- Maven第三方类库热门推荐:Package-Maven-热门推荐-第三方类库
- 模块化拆分原则和规范:Package-Maven-热门推荐-模块化拆分原则和规范
注释
- 由于依赖有传递性,因此在项目中需要尽可能不出现重复的依赖,或者说通过依赖传递的方式来少写一个依赖。
- Maven的不足之处:下载jar包的中途发生下载不全时需要手动删除,若不手动删除本地仓库中的jar包,会造成无法向“远程仓库”获取jar包。
- 提示:
java/文件夹和resources/文件夹,在编译后会变成同一个文件夹。
简介
简要说明
Maven 是一个Java项目管理和构建工具。
- 提供一套标准化的项目结构。
- 使用统一的方式进行自动化构建。
- 管理项目依赖的jar包。
- Maven 的命令名称叫
mvn。
主要功能
- 依赖管理:自动处理项目依赖,通过简单的配置即可下载和管理所需的库。
- 构建管理:通过定义生命周期和插件,可以自动化项目的编译、测试、打包、部署等过程。
- 项目信息管理:通过POM文件,可以管理项目的版本、开发者、许可证等信息。
- 项目文档生成:可以生成项目文档,如API文档等。
- 项目报告:提供多种内置报告,如测试覆盖率、代码质量等。
- 插件系统:Maven拥有丰富的插件,可以扩展其功能,用于执行各种任务。
注意事项
- POM配置:正确配置POM文件对于Maven的使用至关重要,错误的配置可能导致构建失败。
- 依赖冲突:需要注意依赖的版本和范围,避免版本冲突。
- 插件版本:插件版本的选择也很重要,不同的版本可能会有不同的行为。
- 构建性能:Maven构建可能会消耗较多时间,特别是大型项目,需要优化构建配置。
- 网络问题:由于依赖管理需要从中央仓库下载资源,网络问题可能会影响构建过程。
适用场景
- Java项目构建:适用于各种Java项目的构建和管理,特别是大型和多模块项目。
- 多模块项目:Maven的模块化支持使得它非常适合管理具有多个模块的项目。
- 标准化构建:在团队协作中,Maven可以提供标准化的构建流程,确保项目的一致性。
- 依赖管理:当项目依赖众多第三方库时,Maven的依赖管理功能尤为有用。
- 持续集成:在持续集成(CI)环境中,Maven可以自动化构建和测试过程。
- 企业级应用:在企业级应用开发中,Maven的插件和扩展能力可以帮助管理和构建复杂的软件系统。
安装与卸载
详细总结:Package-Maven-安装与卸载
终端命令
配置文件
详细总结:Package-Maven-配置文件
项目“pom.xml”配置文件总结:Package-Maven-“pom.xml”文件
热门推荐
问题总结
详细总结:Package-Maven-问题总结
仓库
- 用于存储资源,包含各种jar包。
仓库分类
- 本地仓库:自己电脑上存放资源的仓库,连接远程仓库获取资源。
- 远程仓库:非本机电脑上的仓库,为本地仓库提供资源。
- 中央仓库:Maven团队维护,存储所有资源的仓库。
- 私服仓库:部门/公司范围内存储资源的仓库,从中央仓库获取资源。
本地仓库默认存储位置
- Debian Linux 系统默认下载到本地仓库的保存位置在:
/home/<用户名>/.m2/repository/ - Windows 系统默认下载到本地仓库的保存位置在:
C:\<用户名>\.m2\repository\
坐标
- 用于描述仓库中资源的位置,使用唯一标识,唯一性定位资源位置。
- 通过标识可以将资源的识别与下载工作交由机器完成。
Maven坐标的主要组成部分
- 组织ID:定义当前Maven项目隶属组织名称(通常是域名反写,例如:com.baidu)。
- 项目ID:定义当前Maven项目名称(通常是模块名称,例如:AI)。
- 版本号:定义当前项目版本号。
约定
- 约定大于配置,有约定(默认值)需要了解一下。
详细总结:Package-Maven-约定
pom.xml文件
pom.xml文件是 Maven 项目的核心配置文件,全称为 Project Object Model (项目对象模型)。- 它定义了项目的构建、依赖、插件和其他项目信息的配置。
pom.xml文件位于 Maven 项目的根目录下,Maven 构建工具通过解析这个文件来执行项目的构建和依赖管理。
详细总结:pom.xml配置文件
依赖管理
依赖具有传递性
- 直接依赖:在当前项目中通过依赖配置建立的依赖关系。
- 间接依赖:被依赖的资源如果依赖其他资源,当前项目间接依赖其他资源。
依赖传递冲突问题
- 路径优先:当依赖中出现相同的资源时,层级越深,优先级越低,层级越浅,优先级越高。
- 声明优先:当资源的相同层级被依赖时,配置顺序靠前的覆盖配置顺序靠后的。
- 特殊优先:当同级配置了相同资源的不同版本,后配置的覆盖先配置的。
可选依赖
- 对外隐藏当前所依赖的资源,即改为透明不可见。
案例
<!-- 暂无 -->
排除依赖
- 主动断开依赖的资源,被排除的资源无需指定版本,即不需要。
案例
<!-- 项目依赖 -->
<dependencies>
<!-- Deeplearning4j 深度学习框架 -->
<dependency>
<groupId>org.deeplearning4j</groupId>
<artifactId>deeplearning4j-core</artifactId>
<version>1.0.0-beta6</version>
<!-- 排除依赖 -->
<exclusions>
<!-- 排除具体依赖 -->
<exclusion>
<artifactId>logging-parent</artifactId>
<groupId>org.apache.logging</groupId>
</exclusion>
</exclusions>
</dependency>
</dependencies>
依赖范围
- 依赖的jar默认情况可以在任何地方使用。
- 可以通过
<scope> </scope>标签设定其作用范围。
作用范围
- 主程序范围有效(main文件夹范围内)
- 测试程序范围有效(test文件夹范围内)
- 是否参与打包(package指令范围内)
| 范围 | 编译 | 测试 | 打包 | 例子 |
|---|---|---|---|---|
| compile | Y | Y | Y | 日志 |
| test | Y | 测试代码 | ||
| provided | Y | Y | 依赖的jar包 | |
| runtime | Y | jdbc |
案例
<!-- 项目依赖 -->
<dependencies>
<dependency> <!-- Deeplearning4j 深度学习框架 -->
<groupId>org.deeplearning4j</groupId>
<artifactId>deeplearning4j-core</artifactId>
<version>1.0.0-beta6</version>
<!-- 设置依赖范围 -->
<scope>compile</scope>
</dependency>
</dependencies>
依赖传递
- 默认情况下,所有依赖都是可传递的,这意味着如果你依赖了一个库,那么这个库所依赖的其他库也会被包含在你的项目中。
<optional>true</optional>:为true时不会传递给子模块。
案例
<!-- 项目依赖 -->
<dependencies>
<dependency> <!-- Deeplearning4j 深度学习框架 -->
<groupId>org.deeplearning4j</groupId>
<artifactId>deeplearning4j-core</artifactId>
<version>1.0.0-beta6</version>
<!-- 是否不允许传递给子模块 -->
<optional>true</optional>
</dependency>
</dependencies>
项目构建生命周期
- 通过定义项目生命周期和构建过程的各个阶段来管理项目的构建、测试和部署。
- Maven 的项目生命周期主要分为三个内置的生命周期:default(默认)、clean 和 site。每个生命周期都由一系列的阶段(Phase)组成,这些阶段是有序的,且后面的阶段依赖于前面的阶段。
| 步骤 | 英文 | 中文 | 功能 |
|---|---|---|---|
| 01 | validate | 校验 | 校验项目是否正确并且所有必要的信息可以完成项目的构建过程 |
| 02 | initialize | 初始化 | 初始化构建状态,比如设置属性值 |
| 03 | generate-sources | 生成源代码 | 生成包含在编译阶段中的任何源代码 |
| 04 | process-sources | 处理源代码 | 处理源代码,比如过滤任意值 |
| 05 | generate-resources | 生成资源文件 | 生成将会包含在项目包中的资源文件 |
| 06 | process-resources | 处理资源文件 | 复制和处理资源到目标目录,为打包阶段做好准备 |
| 07 | compile | 编译 | 编译项目的源代码 |
| 08 | process-classes | 处理类文件 | 处理编译生成的文件,比如对class文件的字节码改善优化 |
| 09 | generate-test-sources | 生成测试源代码 | 生成包含在编译阶段中的任何测试源代码 |
| 10 | process-test-sources | 处理测试源代码 | 处理测试源代码,比如过滤任意值 |
| 11 | generate-test-resources | 生成测试资源文件 | 为测试创建资源文件 |
| 12 | process-test-resources | 处理测试资源文件 | 复制和处理测试资源到目标目录 |
| 13 | test-compile | 编译测试源码 | 编译测试源代码到测试目标目录 |
| 14 | process-test-classes | 处理测试类文件 | 处理测试源代码编译生成的文件 |
| 15 | test | 测试 | 使用适合的单元测试框架运行测试 |
| 16 | prepare-package | 准备打包 | 在实际打包之前,执行任何的必要的操作为打包做准备 |
| 17 | package | 打包 | 将编译好的代码打包成可分发格式的文件,比如jar文件等 |
| 18 | pre-integration-test | 集成测试前 | 在执行集成测试前进行必要的动作,比如搭建需要的环境 |
| 19 | integration-test | 集成测试 | 处理和部署项目到可以运行集成测试环境中 |
| 20 | post-integration-test | 集成测试后 | 在执行集成测试完成后进行必要的动作,比如清理集成测试环境 |
| 21 | verify | 验证 | 运行任意的检查来验证项目包有效且达到质量标准 |
| 22 | install | 安装 | 安装项目到本地仓库,这样项目包可以作为其他本地项目的依赖 |
| 23 | deploy | 部署 | 将最终的项目包复制到远程仓库中与其他开发者和项目共享 |
修改Maven软件配置
配置文件位置
- Maven配置文件位置:
Maven安装位置/conf/settings.xml
修改本地仓库存储位置
- 在配置文件中添加
<localRepository> </localRepository>标签。 - 在标签对中写仓库的存储位置。
<!-- 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>(仓库路径)</localRepository>
修改镜像源
- 修改 maven 的默认软件仓库为“华为镜像源”仓库。
- 华为官方文档:网址连接
- 修改用户配置的Maven镜像源
/home/<用户名>/.m2/目录下的settings.xml文件。(若没有该文件则手动创建该文件) - 修改全局配置的Maven镜像源
/etc/maven/目录下的settings.xml文件。
修改内容如下:
<settings>
<mirrors>
<!--配置具体的仓库的下载镜像-->
<mirror>
<!--镜像的唯一标识符,用来区分不同的mirror元素-->
<id>huaweicloud</id>
<!--对哪种仓库进行镜像,即替代哪个仓库-->
<mirrorOf>central</mirrorOf>
<!--镜像名称-->
<name>华为云镜像源</name>
<!--镜像URL-->
<url>https://mirrors.huaweicloud.com/repository/maven/</url>
</mirror>
</mirrors>
</settings>