理解 maven 的核心概念

前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到教程。

本文以类图的方式,介绍 maven 核心的 12 个概念及相互之间的关系。

Table of Contents

  • 1 maven管理的目标:工程(Project)
    • 1.1 工程依赖关系
    • 1.2 工程聚合关系
  • 2 maven的核心:生命周期和阶段
  • 3 功能实现:插件和Goal
  • 4 仓库(Repository)
  • 5 小结

1 maven管理的目标:工程(Project)

 

maven是一个软件工程(Software Project)管理工具。 对于maven来说,一个软件工程的唯一标识是由开发者(groupId)、生成物(artifactId)、版本(version) 共同决定的。

每个工程都有一个打包类型,可以是jar, war, ear 或 pom。打包类型决定了工程最终产物的类型。 其中pom类型用于构件多模块工程。

工程之间有两种关系:依赖和聚合。

1.1 工程依赖关系

依赖关系的管理是maven最为人称道的地方。一个工程可以依赖多个其他工程, 通过工程的唯一标识(groupId+artifactId+version)可以明确指明依赖的库及版本,而且能够处理 依赖关系的传递。 maven可以指定依赖的作用范围(scope),包括以下几种:

scope编译期测试期运行期说明
*compileVVV默认scope
test V 只在测试期依赖,如junit包
providedVV 运行期由容器提供,如servlet-api包
runtime VV编译期间不需要直接引用
systemVV 编译和测试时由本机环境提供

由于依赖关系的传递性可能会导致依赖的版本、scope等发生冲突,maven提供了仲裁机制,同时也 允许自己通过配置进行依赖管理。

1.2 工程聚合关系

前面提到pom类型用于于构件多模块工程,这体现了project之间的一种聚合关系: 将一系列小的模块聚合成整个产品。

通过聚合后的工程可以同时管理每个相关模块的构建、清理、文档等工作。 聚合关系通过在子工程中指定一个pom类型的project作为父project来定义。

2 maven的核心:生命周期和阶段

maven将工程(Project)的构建过程理解为不同的生命周期(LifeCycle)和阶段(Phase)。 在工程的构建过程中,存在着不同的生命周期,这些生命周期互相独立,之间也没有一定的顺序关系。 每个生命周期又划分为不同的阶段(Phase)。阶段之间有明确的顺序关系, 同一生命周期内的阶段必须按顺序依次执行。

maven内置了三个生命周期,并为每个生命周期内置了一些阶段。 下面列举出maven内置的生命周期及主要的阶段: 

  • default:构建(Build)
    1. validate:验证项目是否正确,所有必需的信息是否可用。
    2. compile:编译项目中的代码。
    3. test:用相关的单元测试框架测试编译后的代码,这些运行的测试并不会随项目打包和布署。
    4. package:将编译后的代码打包成相应的格式文件,如jar包。
    5. integration-test: 如果需要在一个综合环境中运行我们的测试,这个阶段将会运行和布署项目到该环境中。
    6. verify: 检查项目的包是否正确和符合要求。
    7. install:将包安装到本地maven仓库,可以让其他项目作为依赖使用该包。
    8. deploy:将包发布到远程的maven仓库,并提供给其他开发者使用。
  • clean:清理
    1. pre-clean 准备清理
    2. clean 执行清理工作
    3. post-clean 执行清理后的后续工作
  • site:生成项目文档和站点
    1. pre-site 准备生成
    2. site 生成项目站点和文档
    3. post-site 执行生成文档后的后续工作
    4. site-deploy 发布项目文档

更详细的phase说明参考: http://maven.apache.org/guides/introduction/introduction-to-the-lifecycle.html#Lifecycle_Reference

3 功能实现:插件和Goal

Maven中定义的工程周期和阶段只是抽象的概念,不涉及具体的功能。 具体的功能由插件(Plugin)实现。一个插件可以实现多个目标(Goal)。

为了解耦插件的功能和工程阶段,实现高度的可配置性,maven规定插件只是实现目标的功能, 通过配置来决定在哪个阶段执行(Execution)哪些目标操作。 甚至可以把一个Goal绑定到多个Phase,以实现复用。

maven内置了一些默认的插件,并根据不同的工程packing类型在各个phase中默认绑定了一些goal。 下表中列出default生命周期中各阶段默认绑定的goal,其中goal按照管理使用pluginname:goalname的方式标记:

PahsePlugin:Goal
process-resourcesresources:resources
compilecompiler:compile
process-test-resourcesresources:testResources
test-compilecompiler:testCompile
testsurefire:test
packageejb:ejb/ejb3:ejb3/jar:jar/par:par/rar:rar/war:war
installinstall:install
deploydeploy:deploy

最后需要说明的是,maven的插件是一种packaging类型为maven-plugin的project, 可以使用maven project的依赖,配置插件等等一切特性。

4 仓库(Repository)

仓库主要用于获取工程依赖的其他工程的生成物,也可用来部署(deploy)maven工程的生成物。 生成物包括各种打包的生成物以及pom文件。

如果有必要,一个工程可以部署到多个仓库。

仓库可以分为本地库(local)和远程库(remote)。本地库通常位于本机的~/.m2/repository文件夹, 远程库最常见的是maven中央库(),此外也会有一些私服库用于企业内部。

http://repository.jboss.com/maven2/

5 小结

本文梳理了maven的核心概念,整个maven核心概念的全貌如下:

 

概念说明
LifeCycle生命周期,maven内置default,sie,clean三个生命周期
Phase阶段,每个生命周期有不同的阶段
Plugin插件,实现实际的构建功能
Goal一个插件可以实现多个goal,goal具备具体的功能
Execution通过配置,决定在某个Phase执行哪些Goal
Projectmaven管理的目标:软件工程,小的工程可以聚合成大工程
PackageType为了便于管理工程,按照构建目标区分成不同的工程类型,如jar,war,ear等
Dependency依赖,project之间存在依赖关系
DependencyScopemaven对依赖定义了不同的作用范围
Management可以配置一个工程如何管理依赖关系
Repository仓库,存放包,分为本地库和远程库
Build构建的动作。使用maven管理工程,主要是指定将project构建到某个phase

Author: Holbrook Wong <holbrook@holbrook.imac>

Date: 2012-12-24 09:20:24 CST

HTML generated by org-mode 6.33x in emacs 23

 

转自:http://www.cnblogs.com/holbrook/archive/2012/12/24/2830519.html#sec-1.1

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/452190.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

时间跟踪图

事件跟踪图实质上是扩充的脚本&#xff0c;可以认为事件跟踪图是简化的UML顺序图。

1088. [SCOI2005]扫雷Mine【网格DP】

Description 相信大家都玩过扫雷的游戏。那是在一个n*m的矩阵里面有一些雷&#xff0c;要你根据一些信息找出雷来。万圣节到了 &#xff0c;“余”人国流行起了一种简单的扫雷游戏&#xff0c;这个游戏规则和扫雷一样&#xff0c;如果某个格子没有雷&#xff0c;那么它里面的数…

spring data jpa和mybatis的不同

使用spring data JPA和mybatis都是用来访问数据库&#xff0c;但他们的分工不同&#xff1a; 1.spring data jpa默认使用hibernate作为ORM实现&#xff0c;是spring 提供的一套jpa接口&#xff0c;使用spring data jpa主要完成一些简单的增删改查功能。 2.对于复杂的查询功能会…

函数式编程很难,这正是你要学习它的原因

很奇怪不是&#xff0c;很少有人每天都使用函数式编程语言。如果你用Scala&#xff0c;Haskell&#xff0c;Erlang&#xff0c;F#或某个Lisp方言来编程&#xff0c;很可能没有公司会花钱聘你。这个行业里的绝大部分人都是使用像Python&#xff0c;Ruby&#xff0c;Java或C#等面…

函数依赖

设R(U)是一个属性集U上的关系模式&#xff0c;X和Y是U的子集。若对于R(U)的任意一个可能的关系r&#xff0c;r 中不可能存在两个元组在X上的属性值相等&#xff0c; 而在Y上的属性值不等&#xff0c; 则称“X函数确定Y”或“Y函数依赖于X”&#xff0c;记作X→Y。 X→Y&#x…

Java面试——线程池

1、类比介绍 假如有一个工厂&#xff0c;工厂里面有10个工人&#xff0c;每个工人同时只能做一件任务。 因此只要当10个工人中有工人是空闲的&#xff0c;来了任务就分配给空闲的工人做&#xff1b; 当10个工人都有任务在做时&#xff0c;如果还来了任务&#xff0c;就把任务进…

C#关键字的使用

params object[] 用于函数多参数的定义public static void Write(string format, params object[] arg);explicit 关键字用于声明必须使用强制转换来调用的用户定义的类型转换运算符。 例如&#xff0c;在下面的示例中&#xff0c;此运算符将名为 Fahrenheit 的类转换为名为 Ce…

maven 中 pom.xml 配置文件标签说明,dependencyManagement和dependencies区别

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到教程。 参考&#xff1a;http://zhaoshijie.iteye.com/blog/2094478http://blog.csdn.net/cpf2016/article/details/45674377 还有一篇转载文章…

学成在线--17.我的课程

文章目录一.需求分析二.API接口三.PageHelper1.PageHelper介绍2.添加依赖3.配置pageHelper四.Dao1.mapper 接口2.mapper.xml映射文件3.测试Dao五.Service六.Controller七.前端1.创建course_list.vue2.路由3.定义API方法4.前端视图course_list.vue详解1&#xff09;API调用--在视…

码是数据系统中的基本概念。所谓码就是能唯一标识实体的属性或属性集合&#xff0c;他是整个实体集的性质&#xff0c;而不是单个实体的性质。 主属性与非主属性 包含在任何一个候选码中的属性 &#xff0c;称为主属性&#xff08;Prime attribute&#xff09;。 不包含在任何…

关于C编程的一点感受

刚毕业的时候用了两个多月的C语言编程&#xff0c;总的来说对它还是很有感受的&#xff0c;C是一个过程式语言&#xff0c;没有像C,Java等OOP语言这样那样的一系列的规则和限制&#xff1b;它比较灵活&#xff0c;简洁&#xff0c;高效&#xff1b;这些是给我的印象最深的。这是…

如何打造高效的多任务、高并发的网络服务器系统?

同一个功能的软件&#xff0c;不同的团队&#xff0c;不同工程师去实现&#xff0c;肯定是千差万别&#xff0c;甚至从根本上完全不同。所以软件开发在未来很长时间内仍然是一项工匠的手工劳动&#xff0c;尤其像多任务&#xff0c;高并发&#xff0c;偏底层这种对实现技巧比较…

BZOJ.2780.[SPOJ8093]Sevenk Love Oimaster(广义后缀自动机)

题目链接 \(Description\) 给定n个模式串&#xff0c;多次询问一个串在多少个模式串中出现过。(字符集为26个小写字母) \(Solution\) 对每个询问串进行匹配最终会达到一个节点&#xff0c;我们需要得到这个节点所代表的子串出现在多少个模式串中。 建立广义后缀自动机。每次插入…

BigDecimal 加减乘除运算

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到教程。 java.math.BigDecimal。BigDecimal一共有4个够造方法&#xff0c;让我先来看看其中的两种用法&#xff1a; 第一种&#xff1a;BigDeci…

主码 超码 候选码

码是数据系统中的基本概念。所谓码就是能唯一标识实体的属性&#xff0c;他是整个实体集的性质&#xff0c;而不是单个实体的性质。它包括超码&#xff0c;候选码&#xff0c;主码。   超码是一个或多个属性的集合&#xff0c;这些属性可以让我们在一个实体集中唯一地标识一…

学成在线--18.新增课程(课程分类查询)

文章目录一.需求分析二.课程分类查询介绍三.数据结构四.数据格式五.数据模型六.Api接口七.服务器端1.Dao1&#xff09;定义mapper2&#xff09;定义mapper映射文件2.Service3.Controller八.接口测试一.需求分析 用户操作流程如下&#xff1a; 1、用户进入“我的课程”页面&…

给程序员们的工资报价提醒

在薪水上讨价还价的方式有很多种&#xff0c;我要说的这一点也许并不是最好的。然而&#xff0c;如果使用的得当&#xff0c;会收到很好的效果。如果你正在跟一家公司接触(没有经过职业中介)&#xff0c;而且事情看来很顺利&#xff0c;进度很快&#xff0c;你要保持这种面试的…

POI 方式-excle 表格导出实现-java-poi

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到教程。 效果&#xff1a; jsp 页面 用的Bootstrap &#xff1a; <li class"dropdown"> <a href"javascript:void(0)…

02-css的选择器

css的选择器&#xff1a;1.基本选择器 2.高级选择器 基本选择器包含&#xff1a; 1.标签选择器标签选择器可以选中所有的标签元素&#xff0c;比如div&#xff0c;ul&#xff0c;li &#xff0c;p等等&#xff0c;不管标签藏的多深&#xff0c;都能选中&#xff0c;选中的是所有…

iphoneX样式兼容

// 1.viewport meta 标签增加属性viewport-fitcover // 2.body元素增加样式 body { padding-bottom: constant(safe-area-inset-bottom); padding-bottom: env(safe-area-inset-bottom); } // 3.如有fixed底部的元素&#xff0c;也增加上面样式 xxx { padding-bottom: constant…