MAVEN
1. 概述
- Maven是一个项目管理工具,它包含了一个项目对象模型 (Project Object Model),一组标准集合,一个项目生命周期(Project Lifecycle),一个依赖管理系统(Dependency
Management
System),和用来运行定义在生命周期阶段(phase)中插件(plugin)目标(goal)的逻辑。当你使用Maven的时候,你用一个明确定义的项目对象模型来描述你的项目,然后Maven可以应用横切的逻辑,这些逻辑来自一组共享的(或者自定义的)插件。- Maven 有一个生命周期,当你运行 mvn install 的时候被调用。这条命令告诉 Maven 执行一系列的有序的步骤,直到到达你指定的生命周期。遍历生命周期旅途中的一个影响就是,Maven
运行了许多默认的插件目标,这些目标完成了像编译和创建一个 JAR 文件这样的工作。- 此外,Maven能够很方便的帮你管理项目报告,生成站点,管理JAR文件,等等。
2. 安装MAVEN
检查JAVA_HOME环境变量
C:\Users\我超爱学习啊>echo %JAVA_HOME% C:\Program Files\Java\jdk1.8.0_151
解压MAVEN安装包,安装在非中文无空格路径下
F:\apache-maven-3.5.2
配置MAVEN相关环境
MAVEN_HOME或M2_HOME
F:\apache-maven-3.5.2
path
F:\apache-maven-3.5.2\bin
cmd中运行mvn -v命令查看
C:\Users\我超爱学习啊>mvn -v Apache Maven 3.5.2 (138edd61fd100ec658bfa2d307c43b76940a5d7d; 2017-10-18T15:58:13+08:00) Maven home: F:\apache-maven-3.5.2\bin\.. Java version: 1.8.0_151, vendor: Oracle Corporation Java home: C:\Program Files\Java\jdk1.8.0_151\jre Default locale: zh_CN, platform encoding: GBK OS name: "windows 10", version: "10.0", arch: "amd64", family: "windows"
3. 约定目录结构
①根目录:工程名
②src目录:源码
③pom.xml文件:MAVEN工程的核心配置文件
④main目录:存放主程序
⑤test目录:存在测试程序
⑥java目录:存放java源文件
⑦resource目录:存放框架或其他工具配置文件
4.POM
(POM)Project Object Model:项目对象模型。将Java工程的相关信息封装为对象作为便于操作和管理的模型。Maven 工程的核心配置。可以说学习 Maven 就是学习 pom.xml 文件中的配置。
5. 坐标
5.1. 几何中的坐标
- 在一个平面中使用 x、y 两个向量可以唯一的确定平面中的一个点。
- 在空间中使用 x、y、z 三个向量可以唯一的确定空间中的一个点。
5.2. Maven的坐标
使用如下三个向量在 Maven 的仓库中唯一的确定一个 Maven 工程。
- groupId:公司或组织的域名倒序+当前项目名称
- artifactId:当前项目的模块名称
version:当前模块的版本
<groupId>org.springframework</groupId> <artifactId>spring-core</artifactId> <version>4.0.0.RELEASE</version>
5.3. 如何通过坐标到仓库中查找 jar 包?
将 gav 三个向量连起来
org.springframework+spring-core+4.0.0.RELEASE
以连起来的字符串作为目录结构到仓库中查找
org/springframework/spring-core/4.0.0.RELEASE/spring-core-4.0.0.RELEASE.jar
※注意:我们自己的 Maven 工程必须执行安装操作才会进入仓库。安装的命令是:mvn install
6. 依赖
Maven 中最关键的部分,我们使用Maven最主要的就是使用它的依赖管理功能。要理解和掌握 Maven 的依赖管理,我们只需要解决一下几个问题:
- 依赖的目的
当 A jar 包用到了 B jar 包中的某些类时,A 就对 B 产生了依赖,这是概念上的描述。那么如何在项目
中以依赖的方式引入一个我们需要的 jar 包呢?
答案非常简单,就是使用 dependency 标签指定被依赖 jar 包的坐标就可以了。
依赖的范围
上面的依赖信息中除了目标 jar 包的坐标还有一个scope 设置,这是依赖的范围。依赖的范
围有几个可选值,我们用得到的是:compile、test(如:junit)、provided(如:servlet-api.jar)。- 有效性总结:
范围 主程序 测试程序 参与部署 compile √ √ √ test × √ × provided √ √ × 依赖传递性
A 依赖 B,B 依赖 C,A 能否使用 C 呢?当 B 依赖 C 的范围是 compile 则可用,否则不可用。依赖的排除
如果我们在当前工程中引入了一个依赖是 A,而 A 又依赖了 B,那么 Maven 会自动将 A 依赖的 B 引入当前工程,但是个别情况下 B 有可能是一个不稳定版,或对当前工程有不良影响。这时我们可以在引入 A 的时候将 B 排除。
<exclusions>
<exclusion>
<groupId>commons-logging</groupId>
<artifactId>commons-logging</artifactId>
</exclusion>
</exclusions>
统一管理所依赖 jar 包的版本
对同一个框架的一组 jar 包最好使用相同的版本。为了方便升级框架,可以将 jar 包的版本信息统一提取出来- 统一声明版本号
<properties> <chen.spring.version>4.1.1.RELEASE</chen.spring.version> </properties>
其中chen.spring.version 部分是自定义标签。
- 引用前面声明的版本号
<dependencies> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-core</artifactId> <version>${chen.spring.version}</version> </dependency> …… </dependencies>
- 其他用法
<properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> </properties>
依赖的原则:解决 jar 包冲突
- 路径最短者优先
- 路径相同时先声明者优先
这里”声明”的先后顺序指的是 dependency 标签配置的先后顺序。
7. 仓库
7.1. 概述
- 本地仓库:为当前本机电脑上的所有 Maven 工程服务。
- 远程仓库
- 私服:架设在当前局域网环境下,为当前局域网范围内的所有 Maven 工程服务。
- 中央仓库:架设在 Internet 上,为全世界所有 Maven 工程服务。
- 中央仓库的镜像:架设在各个大洲,为中央仓库分担流量。减轻中央仓库的压力,同时更快的响应用户请求。
7.2. 仓库中的文件
- Maven 自身需要的插件
- 我们自己开发的项目的模块
- 第三方框架或工具的 jar 包
※不管是什么样的 jar 包,在仓库中都是按照坐标生成目录结构,所以可以通过统一的方式查询或依赖。
8. 生命周期
8.1. 概述
Maven 生命周期定义了各个构建环节的执行顺序,有了这个清单,Maven 就可以自动化的执行构建命令了。
Maven 有三套相互独立的生命周期:
- Clean Lifecycle 在进行真正的构建之前进行一些清理工作。
- Default Lifecycle 构建的核心部分,编译,测试,打包,安装,部署等等。
- Site Lifecycle 生成项目报告,站点,发布站点。
它们是相互独立的,你可以仅仅调用 clean 来清理工作目录,仅仅调用 site 来生成站点。也可以直接运行 mvn clean install site 运行所有这三套生命周期。
每套生命周期都由一组阶段(Phase)组成,我们平时在命令行输入的命令总会对应于一个特定的阶段。比如,运行 mvn clean,这个 clean 是 Clean 生命周期的一个阶段。有 Clean 生命周期,也有 clean 阶段。
8.2. Clean生命周期
Clean 生命周期一共包含了三个阶段:
- pre-clean 执行一些需要在 clean 之前完成的工作
- clean 移除所有上一次构建生成的文件
- post-clean 执行一些需要在 clean 之后立刻完成的工作
8.3. Site 生命周期
- pre-site 执行一些需要在生成站点文档之前完成的工作
- site 生成项目的站点文档
- post-site 执行一些需要在生成站点文档之后完成的工作,并且为部署做准备
- site-deploy 将生成的站点文档部署到特定的服务器上
- 这里经常用到的是 site 阶段和 site-deploy 阶段,用以生成和发布 Maven 站点。
8.3. Default 生命周期
Default 生命周期是 Maven 生命周期中最重要的一个,绝大部分工作都发生在这个生命周期中。这里,只解释一些比较重要和常用的阶段:
- validate
- generate-sources
- process-sources
- generate-resources
- process-resources 复制并处理资源文件,至目标目录,准备打包。
- compile 编译项目的源代码。
- process-classes
- generate-test-sources
- process-test-sources
- generate-test-resources
- process-test-resources 复制并处理资源文件,至目标测试目录。
- test-compile 编译测试源代码。
- process-test-classes
- test 使用合适的单元测试框架运行测试。这些测试代码不会被打包或部署。
- prepare-package
- package 接受编译好的代码,打包成可发布的格式,如 JAR。
- pre-integration-test
- integration-test
- post-integration-test
- verify
- install 将包安装至本地仓库,以让其它项目依赖。
- deploy 将最终的包复制到远程的仓库,以让其它开发人员与项目共享或部署到服务器上运行。
8.4. 生命周期与自动化构建
运行任何一个阶段的时候,它前面的所有阶段都会被运行,例如我们运行 mvn install 的时候,代码会被编译,测试,打包。这就是 Maven为什么能够自动执行构建过程的各个环节的原因。此外,Maven 的插件机制是完全依赖 Maven 的生命周期的,因此理解生命周期至关重要。
9. 插件和目标
- Maven 的核心仅仅定义了抽象的生命周期,具体的任务都是交由插件完成的。
- 每个插件都能实现多个功能,每个功能就是一个插件目标。
- Maven 的生命周期与插件目标相互绑定,以完成某个具体的构建任务。
例如:compile 就是插件 maven-compiler-plugin 的一个目标;pre-clean 是插件 maven-clean-plugin 的一个目标。
10. IDEA中的MAVEN Web项目
先创建MAVEN项目,勾选
maven-archetype-webapp
,点击next
填写
GroupId
、ArtifactId
、Version
。选择Maven Home Directory
- 填写Project Name。
- 创建完成,然后下载插件,结果如图。
- 在Project Structure中的Facts添加Web。
- 在Project Structure的Facts中设置Deployment Descriptors和Web Resource Directories。
在Project Structure的 Artifacts 添加 Web Application:Exploded。
配置tomcat。
添加Tomcat Server。
- 将刚才的项目部署在tomcat。
- Tips: 由于Maven远程仓库在国外,所以在下载相关jar包时非常慢,可以将其配置为Alibaba的仓库。