环境 系统:macOS Maven:3.6.0
Maven Maven 是一款基于 Java 平台的项目管理和整合工具,它将项目的开发和管理过程抽象成一个项目对象模型(POM)。开发人员只需要做一些简单的配置,Maven 就可以自动完成项目的编译、测试、打包、发布以及部署等工作
约定优于配置
约定优于配置(Convention Over Configuration)是 Maven 最核心的涉及理念之一 ,Maven对项目的目录结构、测试用例命名方式等内容都做了规定,凡是使用 Maven 管理的项目都必须遵守这些规则。
下表显示了项目源代码文件,资源文件和其他配置在 Maven 项目中的默认位置
| 文件 | 目录 |
|---|---|
| Java 源代码 | src/main/java |
| 资源文件 | src/main/resources |
| 测试源代码 | src/test/java |
| 测试资源文件 | src/test/resources |
| 打包输出文件 | target |
| 编译输出文件 | target/classes |
Maven 对系统要求如下表:
| JDK | JDK 7.0 及以上。 |
|---|---|
| 内存 | 没有最低要求。 |
| 磁盘空间 | Maven 安装本身大约需要 10MB。除此之外,其他磁盘空间将用于本地 Maven 存储库。本地存储库的大小将根据使用情况而有所不同,但至少应为 500MB。 |
| 操作系统 | 没有最低要求 |
POM
POM(Project Object Model,项目对象模型)是 Maven 的基本组件,它是以 xml 文件的形式存放在项目的根目录下,名称为 pom.xml。POM 中定义了项目的基本信息,用于描述项目如何构建、声明项目依赖等等。当 Maven 执行一个任务时,它会先查找当前项目的 POM 文件,读取所需的配置信息,然后执行任务。在创建 POM 之前,首先要确定工程组(groupId),及其名称(artifactId)和版本,在仓库中这些属性是项目的唯一标识.在 POM 中可以设置如下配置:
- 项目依赖
- 插件
- 目标
- 构建时的配置文件
- 版本
- 开发者
- 邮件列表
Super POM
无论 POM 文件中是否显示的声明,所有的 POM 均继承自一个父 POM,这个父 POM 被称为 Super POM,它包含了一些可以被继承的默认设置。在maven项目下终端中使用mvn help:effective-pom查看Super POM相关配置。
实际开发过程中,Maven 的 pom.xml 文件不需要手工编写,Maven 提供了大量的原型(Archetype)插件来创建项目,包括项目结构和 pom.xml
命令行创建Maven项目
mvn archetype:generate -DgroupId=net.demo.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 项目核心配置文件。
Tips: maven-archetype-quickstart 原型快速创建一个简单的 Maven 项目
构建项目 mvn clean package 编译后生成target目录说明:
- Maven 命令中包含了两个命令:clean 和 package,其中 clean 负责清理 target 目录,package 负责将项目构建并打包输出为 jar 文件。
- classes:源代码编译后存放在该目录中。
- test-classes:测试源代码编译后并存放在该目录中。
- surefire-reports:Maven 运行测试用例生成的测试报告存放在该目录中。
- helloMaven-1.0-SNAPSHOT.jar:Maven 对项目进行打包生成的 jar 文件。
Maven坐标
<project>
<groupId>net.biancheng.www</groupId>
<artifactId>helloMaven</artifactId>
<packaging>jar</packaging>
<version>1.0-SNAPSHOT</version>
</project>
Maven 坐标主要由以下元素组成:
- groupId: 项目组 ID,定义当前 Maven 项目隶属的组织或公司,通常是唯一的。它的取值一般是项目所属公司或组织的网址或 URL 的反写,例如 com.baidu.www。
- artifactId: 项目 ID,通常是项目的名称。
- version:版本。
- packaging:项目的打包方式,默认值为 jar。
Tips:
以上 4 个元素中 groupId、artifactId 和 version 是必须定义的,packaging 是可选的。
依赖
- Maven 坐标是依赖的前提,所有 Maven 项目必须明确定义自己的坐标,只有这样,它们才可能成为其他项目的依赖
<dependencies>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>servlet-api</artifactId>
<version>2.5</version>
<scope>provided</scope>
</dependency>
</dependencies>
- scope:依赖的范围。
- optional:标记依赖是否可选。
- exclusions:用来排除传递性依赖
Tips:
大部分依赖声明只包含 groupId、artifactId 和 version 三个元素,至于 scope、optional 以及 exclusions 等元素,需要的时候查看文档即可
Maven仓库
本地仓库
Maven 本地仓库实际上就是本地计算机上的一个目录(文件夹),它会在第一次执行 Maven 命令时被创建 配置本地仓库:$MAVEN_HOME/conf 目录下的 settings.xml 文件,通过 localRepository 元素定义另一个本地仓库地址
<settings xmlns="http://maven.apache.org/SETTINGS/1.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/SETTINGS/1.0.0
http://maven.apache.org/xsd/settings-1.0.0.xsd">
<localRepository>$HOME/.m2/repository</localRepository>
</settings>
中央仓库
中央仓库是由 Maven 社区提供的一种特殊的远程仓库,它包含了绝大多数流行的开源构件
远程仓库
如果 Maven 在本地仓库和中央仓库中都找不到依赖的库文件,它就会停止构建过程并输出错误信息到控制台。为避免这种情况的发生,Maven 还提供了远程仓库的概念,它是一种由开发人员自己定制的仓库,其中包含了供其他项目使用的代码库或者构件
Maven 依赖搜索顺序
当通过 Maven 构建项目时,Maven 按照如下顺序查找依赖的构件。
- 从本地仓库查找构件,如果没有找到,跳到第 2 步,否则继续执行其他处理。
- 从中央仓库查找构件,如果没有找到,并且已经设置其他远程仓库,然后移动到第 4 步;如果找到,那么将构件下载到本地仓库中使用。
- 如果没有设置其他远程仓库,Maven 则会停止处理并抛出错误。
- 在远程仓库查找构件,如果找到,则会下载到本地仓库并使用,否则 Maven 停止处理并抛出错误。
声明周期 | 阶段 | 描述 | | --------------------- | -------------------------------------------- | | validate | 验证项目是否正确以及所有必要信息是否可用。 | | initialize | 初始化构建状态。 | | generate-sources | 生成编译阶段需要的所有源码文件。 | | process-sources | 处理源码文件,例如过滤某些值。 | | generate-resources | 生成项目打包阶段需要的资源文件。 | | process-resources | 处理资源文件,并复制到输出目录,为打包阶段做准备。 | | compile | 编译源代码,并移动到输出目录。 | | process-classes | 处理编译生成的字节码文件 | | generate-test-sources | 生成编译阶段需要的测试源代码。 | | process-test-sources | 处理测试资源,并复制到测试输出目录。 | | test-compile | 编译测试源代码并移动到测试输出目录中。 | | test | 使用适当的单元测试框架(例如 JUnit)运行测试。 | | prepare-package | 在真正打包之前,执行一些必要的操作。 | | package | 获取编译后的代码,并按照可发布的格式进行打包,例如 JAR、WAR 或者 EAR 文件。 | | pre-integration-test | 在集成测试执行之前,执行所需的操作,例如设置环境变量。 | | integration-test | 处理和部署所需的包到集成测试能够运行的环境中。 | | post-integration-test | 在集成测试被执行后执行必要的操作,例如清理环境。 | | verify | 对集成测试的结果进行检查,以保证质量达标。 | | install | 安装打包的项目到本地仓库,以供其他项目使用。 | | deploy | 拷贝最终的包文件到远程仓库中,以共享给其他开发人员和项目。 |
分模块开发
- 1.在项目中添加子module,子module拥有自己的pom.xml文件
-
- 把子pom.xml文件中的坐标复制到项目中
<dependency></dependency>
- 把子pom.xml文件中的坐标复制到项目中
-
- 在子module中执行
mvn install把jar包安装到本地的仓库中
- 在子module中执行
依赖管理
依赖冲突
- 路径深度相同的最后配置的为主
可选依赖:主观上我项目中的依赖不想让别人使用 不透明 可选依赖是隐藏当前工程所依赖的资源,隐藏后对应资源将不具有依赖传递性,通过标签控制
排出依赖:主观上不想再项目中使用别人的依赖 不需要 排出依赖是隐藏当前资源对应的依赖关系,使用标签控制
聚合
- 会按照依赖关系自动构建pom.xml
<packaging>pom</packaging>
<modules>
<module>path</module>
</modules>
继承
<parent>
<relativePath> path </relativePath>
</parent>
- 可选依赖
属性
<properties>
// 在引用的地方直接使用${spring-version}
<spring-version>5.2.10.RELEASE</spring-version>
</properties>
-
properties文件获取pom文件的自定义属性
-
添加打war包的插件
多环境配置
跳过测试