认识 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套相互独立的生命周期,分别是:

  1. Clean Lifecycle 在进行真正的构建之前进行的一些清理工具。

  2. Default Lifecycle 构建的核心部分,编译,测试,打包,安装部署等等。

  3. Site Lifecycle 生成项目报告,站点,发布站点

它们是相互独立的,你可以仅仅调用 clean 来清理工作目录,仅仅调用 site 来生成站点。也可以直接运行 mvn clean install site 运行所有这三套声明周期

Clean 生命周期的阶段:

  1. pre-clean 执行一些需要在 clean 之前完成的工作

  2. clean 移除所有上一次构建生成的文件

  3. post-clean 执行一些需要在 clean 之后立刻完成的工作

Site 生命周期的阶段:

  1. pre-site 执行一些需要在生成站点文档之前完成的工作
  2. site 生成项目的站点文档
  3. post-site 执行一些需要在生成站点文档之后完成的工作,并且为部署做准备
  4. 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 常见知识点整理的更多相关文章

  1. vue常见知识点整理

    什么是 mvvm? MVVM 是 Model-View-ViewModel 的缩写.mvvm 是一种设计思想.Model 层代表数据模型,也可以在 Model 中定义数据修改和操作的业务逻辑:View ...

  2. kafka知识点整理总结

    kafka知识点整理总结 只不过是敷衍 2017-11-22 21:39:59 kafka知识点整理总结,以备不时之需. 为什么要使用消息系统: 解耦 并行 异步通信:想向队列中放入多少消息就放多少, ...

  3. JS知识点整理(二)

    前言 这是对平时的一些读书笔记和理解进行整理的第二部分,第一部分请前往:JS知识点整理(一).本文包含一些易混淆.遗漏的知识点,也会配上一些例子,也许不是很完整,也许还会有点杂,但也许会有你需要的,后 ...

  4. mysql常见知识点总结

    mysql常见知识点总结 参考: http://www.cnblogs.com/hongfei/archive/2012/10/20/2732516.html https://www.cnblogs. ...

  5. 【Android 面试基础知识点整理】

    针对Android面试中常见的一些知识点整理,Max 仅仅是个搬运工.感谢本文中引用文章的各位作者,给大家分享了这么多优秀文章.对于当中的解析,是原作者个人见解,有错误和不准确的地方,也请大家积极指正 ...

  6. web前端面试知识点整理

    一.HTML5新特性 本地存储 webStorage websocket webworkers新增地理位置等API对css3的支持canvas多媒体标签新增表单元素类型结构标签:header nav ...

  7. 大数据 -- kafka学习笔记:知识点整理(部分转载)

    一 为什么需要消息系统 1.解耦 允许你独立的扩展或修改两边的处理过程,只要确保它们遵守同样的接口约束. 2.冗余 消息队列把数据进行持久化直到它们已经被完全处理,通过这一方式规避了数据丢失风险.许多 ...

  8. Java容器相关知识点整理

    结合一些文章阅读源码后整理的Java容器常见知识点.对于一些代码细节,本文不展开来讲,有兴趣可以自行阅读参考文献. 1. 思维导图 各个容器的知识点比较分散,没有在思维导图上体现,因此看上去右半部分很 ...

  9. Maven使用常见问题整理

    Maven使用常见问题整理  1.更新eclipse的classpath加入新依赖  1.在dependencyManagement里面加入包括版本在内的依赖信息,如:   <dependenc ...

随机推荐

  1. jquery stop(true,false)的意思

    stop 是jQuery中用于控制页面动画效果的方法.运行之后立刻结束当前页面上的动画效果.stop在新版jQuery中添加了2个参数:第一个参数的意思是是否清空动画序列,也就是stop的是当前元素的 ...

  2. uwsgi启动报错WARNING: Can't find section "uwsgi" in INI configuration file autotestsite_uwsgi.ini

    提示配置文件头部找不到 [uwsgi] 解决: 在最上方加上[uwsgi],有时候明明有标识,但是还是提示,那就再加一个

  3. C#和JAVA 访问修饰符

    JAVA ----------------------------------------------- 访问修饰符        描述 ------------------------------- ...

  4. 【转】基于Redis实现延时队列服务

    背景 在业务发展过程中,会出现一些需要延时处理的场景,比如: a.订单下单之后超过30分钟用户未支付,需要取消订单b.订单一些评论,如果48h用户未对商家评论,系统会自动产生一条默认评论c.点我达订单 ...

  5. Spring Boot - Spring Async

    除了使用Thread.Runnable.TimerTask.FeatureTask.CompletableFuture等类,在Spring Boot中还可以使用注解创建异步任务,可以减少线程处理的代码 ...

  6. 《Beginning Java 7》 - 7 - abstract class 抽象类 和 interface 接口

    1. 抽象类: 为什么用抽象类: 一些 generic 的类本身并没有现实意义,所以不需要被实例化.比如动物,自然界没有动物这个物种,但却有无数的继承自动物的物种,那么动物本身可以是一个抽象类. 抽象 ...

  7. jQuery引入公共库问题

    话说脚本最好放到底部,这样页面既可以逐步呈现,也可以提高下载,但是某些公共模块且有js效果,顺序优先公共库的话,效果是出不来的,所以以后就把公共库最好放在头部,(就是这个而已:http://apps. ...

  8. “全栈2019”Java第十二章:变量

    难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java第 ...

  9. JQuery的基本用法总结

    1.jquery概念 是js的一个类库    (对js中某些功能的封装) 用jq实现的功能一定能用js实现 反过来 不一定  ,js实现的功能jq不一定能实现 2.jquery好处 1.代码简洁 2. ...

  10. Python 验证码识别(别干坏事哦...)

    关于python验证码识别库,网上主要介绍的为pytesser及pytesseract,其实pytesser的安装有一点点麻烦,所以这里我不考虑,直接使用后一种库. python验证码识别库安装 要安 ...