Maven 是一项 Java 核心技术栈,主要用于项目构建和依赖管理。
本文根据尚硅谷 Maven 课程,对 Maven 知识点进行整理与分享。
课程:尚硅谷 Maven 课程
1. Maven 相关概念
1.1 Maven 作用
Maven 是 Apache 软件基金会的自动化构建工具,为 Java 平台的项目构建
和依赖管理
提供帮助。
Maven 的词义是 专家,内行。
生产环境需要多个 jar 包,并对其进行管理。Maven的作用就是管理 jar 包。具体包括以下作用:
-
添加第三方 jar 包。Maven可以保证每个 jar 包在系统中只存在一份,而不是每个模块都放一份。
-
管理 jar 包之间的依赖关系。
-
获取第三方 jar 包。可以理解为类似 EndNote 的管理体系,也就是不仅能管理,还能下载。
-
将项目拆分为多个工程。工程间的调用和访问,可以通过 Maven 的依赖管理机制实现。
1.2 Maven 项目构建
项目构建,可以从三方面来看:
- Java 代码构建:Java 代码需要编译,才能执行。
- Web 工程构建:Web 工程需要先编译,再部署到服务器中,再启动服务器,才能执行。
- 实际项目构建:实际项目需要整合第三方框架。除了配置 Web 工程,还要提供第三方框架的 jar 包和各种配置文件,将它们部署到服务器并启动服务器,才能执行。
开发过程中,所有路径或配置文件中配置的路径,都是以编译结果的目录结构为标准的。
构建环节,包括以下内容:
- 清理:删除旧的编译结果 class 文件,为下一次编译做准备。
- 编译:将 Java 源程序编译为 class 字节码文件。
- 测试:对项目关键节点进行测试,调用 junit 程序。
- 报告:每次测试后以标准格式记录和展示测试结果。
- 打包:将动态工程封装为压缩文件,用于安装或部署。Java 工程对应 jar 包,Web 工程对应 war 包。
- 安装:Maven 的特定概念,将 jar 包或 war 包安装到本地仓库。
- 部署:将打包的结果部署到远程仓库,或将 war 包部署到 Servlet 容器的指定目录下,使其可以运行。
Maven 的作用就是,可以自动完成上述全部构建过程。如下图所示。
1.3 Maven 自动化构建原理
Maven 自动化构建原理,包括以下内容:
- POM
- 约定的目录结构
- 坐标
- 依赖管理
- 仓库管理
- 生命周期
- 插件和目标
- 继承
- 聚合
Maven 的核心程序提供了抽象生命周期,而具体操作由Maven插件来完成。
1.4 POM
POM,即 Project Object Model 项目对象模型
,在项目中体现为 pom.xml。
pom.xml 是 Maven 工程的核心配置文件,与构建过程相关的一切设置都在这个文件中。类似于 web.xml 对于动态 Web 工程。
1.5 坐标
Maven 中使用以下三个坐标可以唯一确定一个 Maven 工程。
-
groupId:公司或组织域名倒序 + 项目名。
-
例如:
-
com.bluestragglers.maven
-
-
artifactId:模块名称。
-
例如:
-
helloworld
-
-
version:版本号。
-
例如:
-
1.0.0
-
-
上述坐标对应文档路径存储在:
-
/com/bluestragglers/maven/helloworld/helloworld-1.0.0.jar
坐标可以简称为 GAV,不要只记住后两个字母(。
1.6 依赖
课程介绍了两个课外内容:
- snapshot:快照,是会频繁进行迭代开发的版本。
- release:完成版本,可以达到发布要求。
依赖内容:
<dependency>
<groupId>com.bluestragglers.com</groupId>
<artifactId>Hello</artifactId>
<version>0.0.1-SNAPCHAT</version>
<scope>compile</scope>
</dependency>
Maven 解析依赖信息时会到本地仓库中查找被依赖的 jar 包。对于自己开发的 Maven 工程,使用 install 命令安装后就可以放入仓库。
依赖的范围包括三种:
- compile
- test
- provided
区别包括:
test 典型例子是编写 junit,只测试,不参与主程序和打包。
provided 典型例子是编写 servlet-api.jar,不参与打包、部署和运行。
依赖具有传递性。根据依赖是 compile, test 和 provided,确定是否能够传递。像 test 就不能传递。
依赖排除,通过
<exclusions>
<exclusion>
<groupId>commons-logging</groupId>
<artifactId>commons-logging</artifactId>
</exclusion>
</exclusions>
统一管理版本号,建议采用 properties 标签内统一声明版本号。需要同一版本的位置,使用$(自定义标签名)
来统一版本位置。
- properties 标签统一声明可以用于各个场景。
1.7 继承
例如,针对问题:
- Hello 依赖的 junit:4.0
- HelloFriend 依赖的 junit:4.0
- MakeFriend 依赖的 junit:4.9
需要将依赖的版本统一。
解决思路是,将 junit 依赖版本统一提取到父工程中,子工程声明依赖时不指定版本。
操作步骤:
- 创建一个 Maven 工程作为父工程,打包方式是:POM(不是 jar 和 war)。
- 在子工程中声明对父工程的引用。
- 在子工程的坐标中删除与父工程重复的部分。
- 在父工程中统一依赖。
- 在子工程中删除不同的依赖。
<parent>
<groupId>com.bluestragglers.maven</groupId>
<artifactId>Parent</artifactId>
<version>0.0.1-SNAPSHOT</version>0
<!-- 以当前文件为基准的父工程pom.xml文件的相对路径 -->
<relativePath>../Parent/pom.xml</relativePath>
</parent>
1.7 聚合
聚合的作用是一步安装各个模块工程。
可以另外设置一个聚合工程,也可以在父工程里配置。
<modules>
<module>../Hello</module>
<module>../HelloFriend</module>
<module>../MakeFriends</module>
</modules>
配置完成后,在聚合工程的 pom.xml 上 install 即可。
1.8 配置
配置的作用是将包部署在远程仓库中。命令是 deploy。
内部
<build>
<finalName>BlueStragglers</finalName>
<plugins>
<plugin>
<groupId>org.codehaus.cargo</groupId>
<artifactId>cargo-maven2-plugin</artifactId>
<version>1.2.3</version>
<configuration>
<container>
<containerId>tomcat6x</containerId>
<home>D:\DevInstall\apache-tomcat-6.0.39</home>
</container>
</configuration>
<executions>
<execution>
<id>cargo-run</id>
<phase>install</phase>
<goals>
<goal>run</goal>
</goals>
</execution>
</plugin>
</plugins>
</build>
1.9 生命周期
Maven 三套Lifecycle 生命周期
,分别是:
- Clean Lifecycle:构建前的清理。
- Default Lifecycle:构建的核心部分,包括编译、测试、打包、安装、部署等。
- Site Lifecycle:构建后的生成项目报告,生成站点,发布站点。
三套生命周期相互独立,可以仅调用 clean 清理工作目录,site 生成站点,也可以 mvn clean install site 运行三个生命周期。
每套生命周期由一组phrase 阶段
组成,平时输入的命令对应于一个特定阶段,如 mvn clean 对应 Clean Lifecycle 的 clean 阶段。
Clean Lifecycle 包含三个阶段:
- pre-clean
- clean
- post-clean
Site Lifecycle 包含四个阶段:
- pre-site
- site
- post-site
- site-deploy
最重要的 Default Lifecycle 包含以下阶段:
- process-resources:复制并处理资源文件到目标目录,准备打包。
- compile:编译项目源码。
- process-test-resources:布置并处理资源文件到目标测试目录。
- test-compile:编译测试源码。
- test:运行测试。不会打包或部署。
不论要执行这个生命周期中的哪个阶段,都是从这个生命周期开头开始执行。但进行到哪里是看指定的位置。
2. Maven 相关配置
2.1 Maven 基础配置
IDEA 使用 Maven,在 pom.xml 里面可以配置依赖 dependencies,在 Lifecycle 里面可以清理 clean,package 打包,install 安装等等。
通常采用 springboot 创建 web 工程。
Maven 工程目录结构:
- 根目录:工程名。
- src:源码。
- pom.xml:Maven 工程的核心配置文件。
- main:主程序。相应的,test 为测试程序。
- java:Java 源文件。
- resources:框架或其他工具的配置文件。
设置 Maven 创建工程的 JDK 版本:
-
打开 settings.xml,找到 profiles 标签,添加相应配置。
-
jdk-1.8 true 1.8 1.8 1.8 1.8
2.2 Maven 联网
Maven 核心程序仅仅定义了抽象的生命周期,而具体工作需要由特定插件完成,插件需要联网获取。
Maven 默认会在本地仓库先搜索。本地仓库地址默认位置为:[usr_home]\.m2\repository。
可以通过修改 Maven\conf\settings.xml 中的 localRepository 修改仓库位置。
3. Maven 常用命令
执行与构建过程相关的 Maven 命令,通过命令行构建,必须进入工程文件的 pom.xml 所在目录,随后执行相应命令即可。
常用的 Maven 命令包括:
- mvn clean:清理。
- mvn compile:编译主程序。
- mvn test-compile:编译测试程序。
- mvn test:测试。
- mvn package:打包。
- mvn install:安装。
- mvn site:生成站点。
- mvn deploy:将最终的包复制到远程仓库,从而将内容部署在服务器上运行。
执行这些命令都按照生命周期顺序进行,例如执行打包命令,会首先执行测试命令,随后再打包。
Comments | NOTHING