Maven 常见知识点整理
认识 Maven
Maven 的作用?
1.添加第三方jar包
2.解决jar包之间的依赖关系
3.获取第三方jar包
4.将项目拆成多个工程模块
Maven 是什么?
是Apache软件基金会组织维护的一款自动化构建工具,专注服务于 Java 平台的项目构建和依赖管理。
构建过程
1.清理:删除以前的编译结果,为重新编译做好准备。
2.编译:将 Java 源程序便以为字节码文件。
3.测试:针对项目中的关键点进行测试,确保项目在迭代开发过程中关键点的正确性。
4.报告:在每一次测试后以标准的格式记录和展示测试结果
5.打包:将一个包含诸多文件的工程封装为一个压缩文件用于安装或部署。Java 工程对应 jar 包,Web 工程对应 war 包。
6.安装:在 Maven 环境下特指将打包的结果—— jar 包或 war 包安装到本地仓库。
7.部署:将打包的结果部署到远程仓库或将 war 包部署到服务器上运行。
Maven 核心概念
1.POM
2.约定的目录结构
3.坐标
4.依赖管理
5.仓库管理
6.生命周期
7.插件和目标
8.继承
9.聚合
原理与约定
Maven 的核心程序中仅仅定义了抽象的声明周期,具体的操作是由 Maven 的插件完成的。Maven 的插件不包含在 Maven 的核心程序中,在首次使用时需要联网下载。
下载的插件被保存在本地仓库,本地仓库的默认位置是:~\.m2\repository
约定的目录结构对于 Maven 实现自动化构建是必不可缺的一环,Maven 必须能找到 Java 源文件,编译后的字节码也有一个存储的位置,所以约定至关重要。
目录结构:
项目
src
main
java
resources
test
java
resources
target
src:源码目录
main:主程序目录
main->java:主程序的Java源文件目录
main->resources:主程序的资源文件目录
test:测试程序目录
test->java:测试程序的Java源文件目录
test->resources:测试程序的资源文件目录
核心概念
POM
Project Object Model:项目对象模型。将 Java 工程的相关信息封装为对象作为便于操作和管理的模型。Maven 工程的核心配置。可以说学习 Maven 就是学习 pom.xml 文件中的配置。
Maven 坐标
在空间中需要 x、y、z三个向量确定一个点
使用如下三个向量在 Maven 的仓库中唯一的确定一个 Maven 工程(gav)。
1.groupid:公司或组织的域名倒叙+当前项目名称
2.artifactid:当前项目的模块名称
3.version:当前模块的版本
<groupId>com.jikedaquan.maven</groupId>
<artifactId>Hello</artifactId>
<version>0.0.1-SNAPSHOT</version>
使用命令 mvn install 执行安装后 Maven 工程进入仓库,通过两个步骤查找 jar 包。
1.将 gav 三个向量连起来
com.jikedaquan.maven+Hello+0.0.1-SNAPSHOT
2.以连起来的的字符串作为目录结构到仓库中查找
com/jikedaquan/maven/Hello/0.0.1-SNAPSHOT/Hello-0.0.1-SNAPSHOT.jar
依赖
使用 Maven 就是为了使用它的依赖功能,当 A jar 包用到了 B jar 包的某些类时,A 对 B 产生了依赖。
实现依赖:
<dependency>
<groupId>com.jikedaquan.maven</groupId>
<artifactId>Hello</artifactId>
<version>0.0.1-SNAPSHOT</version>
<scope>compile</scope>
</dependency>
依赖的范围有:compile(编译)、test(测试)、provided(部署)
| 作用 | compile | test | provided |
|---|---|---|---|
| 主程序 | √ | × | √ |
| 测试程序 | √ | √ | × |
| 参与部署 | √ | × | × |
依赖的传递:A 依赖 B,B 依赖 C ,A 是否能使用 C?要看 B 依赖 C 的范围是不是 compile
依赖的排除:
<dependencies>
<dependency>
<groupId>com.jikedaquan</groupId>
<artifactId>c</artifactId>
<version>1.0-SNAPSHOT</version>
<exclusions>
<exclusion>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</exclusion>
</exclusions>
</dependency>
</dependencies>
对版本号进行统一:
1.统一声明版本号
<properties>
<mysql-connector.version>5.1.47</mysql-connector.version>
</properties>
2.引用前面声明的版本号:
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>${mysql-connector.version}</version>
</dependency>
仓库
仓库有本地仓库和远程仓库,远程仓库包含私服、中央仓库、中央仓库的镜像。
仓库中存储的文件有 Maven 的插件、我们自己开发的项目的模块、第三方框架或工具的 jar 包。
生命周期
Maven 生命周期定义了各个构建缓解的执行顺序,有了这个清单,Maven 就可以自动化的执行构建命令了。
有3套相互独立的生命周期,分别是:
Clean Lifecycle 在进行真正的构建之前进行的一些清理工具。
Default Lifecycle 构建的核心部分,编译,测试,打包,安装部署等等。
Site Lifecycle 生成项目报告,站点,发布站点
它们是相互独立的,你可以仅仅调用 clean 来清理工作目录,仅仅调用 site 来生成站点。也可以直接运行 mvn clean install site 运行所有这三套声明周期
Clean 生命周期的阶段:
pre-clean 执行一些需要在 clean 之前完成的工作
clean 移除所有上一次构建生成的文件
post-clean 执行一些需要在 clean 之后立刻完成的工作
Site 生命周期的阶段:
- pre-site 执行一些需要在生成站点文档之前完成的工作
- site 生成项目的站点文档
- post-site 执行一些需要在生成站点文档之后完成的工作,并且为部署做准备
- site-deploy 将生成的站点文档部署到特定的服务器上
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
verify
install 将包安装至本地仓库,以让其他项目依赖
deploy 将最终的包复制到远程的仓库,以让其他开发人员与项目共享或部署到服务器上运行
运行任何一个阶段的时候,它前面的所有阶段都会被运行
插件和目标
Maven 的核心仅仅定义了抽象的声明周期,具体的任务都是交给插件完成的。
每个插件都能实现多个功能,每个功能就是一个插件目标
Maven 的声明周期与插件目标相互绑定,以完成某个具体的构建任务
继承
非 compile 范文的依赖信息是不能在“依赖链”中传递的,所以有需要的工程只能单独配置。
| 工程 | 依赖 |
|---|---|
| Hello | <dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>4.0</version><scope>test</scope></dependency> |
| HelloFriend | <dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>4.0</version><scope>test</scope></dependency> |
| MakeFriend | <dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>4.0</version><scope>test</scope></dependency> |
如果将各模块的版本统一为 4.9,各个模块单独修改是不可取的,可以使用继承机制将依赖信息统一提取到父工程模块中进行统一管理。
实现继承
1.创建父工程:打包方式设置为 pom
2.在子工程中已用父工程
<parent>
<!-- 父工程坐标 -->
<groupId>...</groupId>
<artifactId>...</artifactId>
<version>...</version>
<relativePath>从当前目录到父项目的 pom.xml文件的相对路径</relativePath>
</parent>
如果此时子工程的 groupId 和 version 和父工程重复则可以删除
3.在父工程中管理依赖
将 Parent 项目中的 dependencies 标签,用 dependencyManagement 标签括起来
<dependencyManagement>
<dependencies>
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.17</version>
</dependency>
</dependencies>
</dependencyManagement>
在子项目中重新制定需要的依赖,删除范围和版本号
<dependencies>
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
</dependency>
</dependencies>
聚合(多模块)
将多个工程拆分为模块后,需要手动逐个安装到仓库后依赖才能够生效。修改源码后也需药逐个手动进行 clean 操作。而使用了聚合之后就可以批量进行 Maven 工程的安装、清理工作。
配置聚合:
在总的聚合工程中使用 modules/module 标签组合,指定模块工程的相对路径集合
<modules>
<module>test</module>
<module>b</module>
</modules>
我们可以到 http://mvnrepository.com/搜索需要的 jar 包的依赖信息。
搜索关注公众号「享智同行」,第一时间获取技术干货
Maven 常见知识点整理的更多相关文章
- vue常见知识点整理
什么是 mvvm? MVVM 是 Model-View-ViewModel 的缩写.mvvm 是一种设计思想.Model 层代表数据模型,也可以在 Model 中定义数据修改和操作的业务逻辑:View ...
- kafka知识点整理总结
kafka知识点整理总结 只不过是敷衍 2017-11-22 21:39:59 kafka知识点整理总结,以备不时之需. 为什么要使用消息系统: 解耦 并行 异步通信:想向队列中放入多少消息就放多少, ...
- JS知识点整理(二)
前言 这是对平时的一些读书笔记和理解进行整理的第二部分,第一部分请前往:JS知识点整理(一).本文包含一些易混淆.遗漏的知识点,也会配上一些例子,也许不是很完整,也许还会有点杂,但也许会有你需要的,后 ...
- mysql常见知识点总结
mysql常见知识点总结 参考: http://www.cnblogs.com/hongfei/archive/2012/10/20/2732516.html https://www.cnblogs. ...
- 【Android 面试基础知识点整理】
针对Android面试中常见的一些知识点整理,Max 仅仅是个搬运工.感谢本文中引用文章的各位作者,给大家分享了这么多优秀文章.对于当中的解析,是原作者个人见解,有错误和不准确的地方,也请大家积极指正 ...
- web前端面试知识点整理
一.HTML5新特性 本地存储 webStorage websocket webworkers新增地理位置等API对css3的支持canvas多媒体标签新增表单元素类型结构标签:header nav ...
- 大数据 -- kafka学习笔记:知识点整理(部分转载)
一 为什么需要消息系统 1.解耦 允许你独立的扩展或修改两边的处理过程,只要确保它们遵守同样的接口约束. 2.冗余 消息队列把数据进行持久化直到它们已经被完全处理,通过这一方式规避了数据丢失风险.许多 ...
- Java容器相关知识点整理
结合一些文章阅读源码后整理的Java容器常见知识点.对于一些代码细节,本文不展开来讲,有兴趣可以自行阅读参考文献. 1. 思维导图 各个容器的知识点比较分散,没有在思维导图上体现,因此看上去右半部分很 ...
- Maven使用常见问题整理
Maven使用常见问题整理 1.更新eclipse的classpath加入新依赖 1.在dependencyManagement里面加入包括版本在内的依赖信息,如: <dependenc ...
随机推荐
- Crystal Report保留小数位
If IsNull({DECL_INV_ITEM_I.DECLEAR_NO}) Or Trim({DECL_INV_ITEM_I.DECLEAR_NO}) = "" Then &q ...
- SOLR企业搜索平台 三 (schema.xml配置和solrj的使用)
标签:solrj 原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本声明.否则将追究法律责任.http://3961409.blog.51cto.com/3951409/8 ...
- [java]基于UDP的Socket通信Demo
java课编程作业:在老师给的demo的基础上实现客户端发送数据到服务器端,服务器端接受客户端后进行数据广播. 整体功能类似于聊天室,代码部分不是太难,但是在本机测试的时候出现这样的问题: 服务端通过 ...
- Linux中Consul集群部署
分配三台虚拟机: 192.168.5.125 192.168.5.128 192.168.5.129 在每台虚拟机上创建 /usr/consul 文件件 命令: mkdir /usr/consul ...
- vc6.0 Buile菜单下 Profile的作用
Profile的作用 帮助你分析并发现程序运行的瓶颈,找到耗时所在,同时也能帮助你发现不会被执行的代码.从而最终实现程序的优化. Profile的组成 Profile包括3个命令行工具:PREP,PR ...
- 爬虫开发.2urllib模块
一.urllib库 概念:urllib是Python自带的一个用于爬虫的库,其主要作用就是可以通过代码模拟浏览器发送请求.其常被用到的子模块在Python3中的为urllib.request和urll ...
- adb命令之pm
常用的用法: 查看已经安装的包 pm list packages 查看已经安装的包以及apk路径(-3:只看第三方应用: -s:只看系统应用) -f: see their associated fil ...
- mysqldump导出数据不带时区信息的问题
今天在导出数据时,发现所有timestamp字段都不带时区信息,因为我在东8区,导出的数据中所有时间都提早了8个小时 首先先看表的字段和数据 CREATE TABLE IF NOT EXISTS `a ...
- [Objective-C语言教程]常量(7)
常量指的是程序在执行期间不会改变的固定值.这些固定值也称为文字.常量可以是任何基本数据类型,如整数常量,浮点常量,字符常量或字符串文字.还有枚举常量.常量被视为常规变量,只不过它们的值在定义后无法修改 ...
- 事件委托,元素节点操作,todolist计划列表实例
一. 事件委托 事件委托就是利用冒泡的原理,把事件加到父级上,来代替子集执行相应的操作,事件委托首先可以极大减少事件绑定次数,提高性能:其次可以让新加入的子元素也可以拥有相同的操作. 比如有20个&l ...