认识 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. duilib入门简明教程 -- 界面设计器 DuiDesigner (10)

       上一个教程讲解了怎么布局最大化.最小化.关闭按钮,但是如果手动去计算这三个按钮的位置和大小的话,非常的不直观,也很不方便.     所以这一章准备介绍duilib的UI设计器,由于这个设计器很不 ...

  2. [linux] ubuntu 切换默认的/bin/sh

    [linux] ubuntu 切换默认的/bin/sh 背景 ubuntu 默认的sh, 也就是/bin/sh默认被切换成了dash,dash体积相对于bash更小,并且性能相对于bash更好, 但是 ...

  3. C#高级特性:动态绑定

    C#高级特性:动态绑定 动态绑定 动态绑定将类型绑定(类型解析.成员和操作过程)从编译时推迟到了运行时.在编译时,如果程序员知道某个特定函数.成员的存在而编译器不知道,那么这种操作是非常有用的,这种情 ...

  4. Python【运算符】

    本文介绍 1.Python运算符 运算符分类 运算符分为:算数运算.比较运算.逻辑运算.赋值运算.成员运算.身份运算.位运算 一.算数运算:返回数字 假设变量a=10,b=20 运算符: + 相加a+ ...

  5. JavaScript类型检测汇总

        曾经我以为JavaScript中的类型检测只要使用 typeof 或 instanceof 就可以通通解决.后来我发现我是too young too naive啊!早说过JavaScript是 ...

  6. UWA发布 | 2017 Unity手游体检蓝皮书 — ARPG篇

    报告目录: 一.ARPG手游总体性能开销分析 二.ARPG手游CPU模块性能开销分析 三.ARPG手游内存模块性能开销分析 四.ARPG手游资源管理分析 五.UWA对于ARPG手游研发团队的建议 一. ...

  7. php-fpm 操作命令

    以下内容转自 https://www.cnblogs.com/alibai/p/4070076.html 和 https://blog.csdn.net/wzx19840423/article/det ...

  8. BeginEditorCommand的原理

    代码来源 :http://www.arch-pub.com/problem-about-CPropertyPage_10682271.html CWnd* pAcadWnd = CWnd::FromH ...

  9. nginx高性能WEB服务器系列之七--nginx反向代理

    nginx系列友情链接:nginx高性能WEB服务器系列之一简介及安装https://www.cnblogs.com/maxtgood/p/9597596.htmlnginx高性能WEB服务器系列之二 ...

  10. Linux新手随手笔记1.9-使用Apache搭建网站

    搭建网站 网站服务:让用户能够通过浏览器访问到的服务器上的文档资源. 对比Windows 和Linux部署服务方法对比 Windows:IIS Linux      :Apache ,nginx Ap ...