设为首页 收藏本站
查看: 1028|回复: 0

[经验分享] Apache Maven 2 简介

[复制链接]

尚未签到

发表于 2018-11-29 06:45:32 | 显示全部楼层 |阅读模式
  转载自:http://www.linuxidc.com/Linux/2011-07/38965p2.htm
  Maven 2 概览
  Maven 是一个顶级的 Apache Software Foundation 开源项目,创建它最初是为了管理 Jakarta Turbine 项目复杂的构建过程。从那以后,不论是开源开发项目还是私有开发项目都选择 Maven 作为项目构建系统。Maven 快速地发展着,如今已是第二版,Maven 已经从针对单个复杂项目的定制构建工具成长为广泛使用的构建管理系统,其丰富的功能可以应用于大多数的软件开发场景。
  概括来讲,Maven 2 能够:


  • 理解项目通常是如何构建的。  


  • 利用其内嵌的项目知识简化和便利项目构建。  


  • 利用其内嵌的项目知识来帮助用户理解复杂的项目结构和构建过程中潜在的变数。  


  • 设计并实现一个经证实的依赖项管理系统,该系统顺应了当今全球化和相互联系的项目团队的需求。  


  • 利用其内部知识,针对简单项目提供简单的用户体验。  


  • 对于高级用户来说相当灵活;针对特别的应用场景,可以覆盖其内嵌模型,也可以通过配置、部署元数据或创建自定义插件对其内嵌模型进行改写。  


  • 全面扩展现有行为之外的场景细节。  


  • 捕获新出现的最佳实践和各个用户社区间的经确认的共同性,并将它们纳入到 Maven 的内嵌项目知识中,从而不断地得到改进。
  Maven 2 —— 概念性的概览
  为捕捉项目构建知识,Maven 2 依赖于一套发展中的有关事物如何运转的概念性模型。部分模型被硬编码为 Maven 代码库的一部分,这些模型通过新的 Maven 发布版本不断得到精炼。图 1 解释了 Maven 2 的关键模型:
  
图 1. Maven 2 对象和操作模型
  
DSC0000.jpg
  图 1 中的关键组件为:


  • 项目对象模型(POM): POM 是 Maven 2 中的里程碑式的模型。该模型的一部分已经构建到 Maven 引擎(被亲切地称为反应堆 )中,其余部分则通过一个名叫 pom.xml 的基于 XML 的元数据文件来声明。  


  • 依赖项管理模型: Maven 对如何管理项目的依赖项很在行。依赖项管理是一片灰色地带,典型的构建-管理工具和系统都未明确涉及。Maven 2 构建了 Maven 依赖项管理模型,该模型能够适应大多数需求。这个模型被证明是有效而高产的模型,目前,主要的开源项目都部署了该模型。  


  • 构建生命周期和阶段:和 POM 相关的概念是构建生命周期阶段。这是 Maven 2 的内嵌概念模型和现实物理世界之间的接口。使用 Maven 时,工作主要是通过插件来执行的。在构建周期中,Maven 2 通过遵循一系列定义好的阶段,将这些插件协调起来。  


  如果您对其中一些概念还有点模糊,请不要担心。接下来的部分会用具体的例子来巩固这些模型背后的概念。

Maven 2 —— 物理概览  图 2 揭示了 Maven 2 的操作方式和与之交互的方式,同时显示了它的物理构成。图 2 提供了有关如何与 Maven 进行交互的概览:
  
图 2. Maven 2 操作和交互模型
  
DSC0001.gif
  图 2 中,POM 是 Maven 对您的特定项目的理解。这个模型由包含在一系列 pom.xml 文件中的声明性描述构成。这些 pom.xml 文件构成一棵树,每个文件能从其父文件中继承属性。Maven 2 提供一个 Super POM。这个 Super POM 位于层级树的顶端,它包含所有项目的默认通用属性;每个项目的 POM 都从这个 Super POM 处继承。
  依赖项被指定为 pom.xml 文件的一部分。Maven 根据其依赖项管理模型解析项目依赖项。Maven 2 在本地存储库和全球存储库寻找依赖性组件(在 Maven 术语里称作工件 )。在远程存储库中解析的工件被下载到本地存储库中,以便使接下来的访问可以有效进行。Maven 2 中的这个依赖项解析器可以处理可递 依赖项。即,它能有效地解析您的依赖项所依赖的那些依赖项。
  Maven 引擎通过插件 亲自执行几乎所有的文件处理任务。插件被配置和描述在 pom.xml 文件中。依赖项管理系统将插件当作工件来处理,并根据构建任务的需要来下载插件。每个插件都能和生命周期中的不同阶段联系起来。Maven 引擎有一个状态机,它运行在生命周期的各个阶段,在必要的时候调用插件。
  理解 Maven 2 依赖项管理模型
  在有效利用 Maven 2 之前,您需要理解 Maven 2 依赖项管理模型是如何运行的。
  依赖项开发适应于这样的项目,其软件组件(称作模块 )是由不同的项目团队开发的。它支持持续独立开发,也支持对所有依赖模块进行精炼。
  这个团队协作场景在通过 Internet 建立和维护的开源项目中十分常见,由于内部开发大受开源或外包世界的冲击和影响,这种场景在合作开发的圈子里日益盛行。
  解析项目依赖项
  Maven 2 依赖项管理引擎帮助解析构建过程中的项目依赖项。

Maven 本地存储库和远程存储库
  Maven 2 本地存储库是磁盘上的一个目录,通常位于 HomeDirectory/.m2/repository。这个库扮演着高性能本地缓存的角色,存储着在依赖项解析过程中下载的工件。远程存储库要通过网络访问。可以在 settings.xml 配置文件中维护一个远程存储库列表以备使用。
  实践中,依赖项在 pom.xml 文件内的  元素中指定,并作为 POM 的一部分注入到 Maven 中。
  项目依赖项存储在存储库服务器(在 Maven 术语中简单地称之为存储库 )上。要成功的解析依赖项,需要从包含该工件的存储库里找到所需的依赖性工件。

通过 settings.xml 配置 Maven
  可以在一个 settings.xml 文件中指定影响 Maven 操作的配置属性。默认的设置文件是 MavenInstallationDirectory/conf/settings.xml。Maven 2 用户可通过维护 UserHomeDirectory/.m2/settings.xml 来覆盖一些配置属性。参见 Maven 设置参考,获取更多有关可配置设置的信息。
  基于 POM 中的项目依赖项信息,该依赖项解析器试图以下列方式解析依赖项:


  • 检查本地存储库中的依赖项。
  • 检查远程存储库列表中的依赖项。
  • 如果前两步失败,则报告一个错误。
  默认情况下,第二步中所涉及的第一个远程存储库是一个能在全球访问的集中式 Maven 2 存储库,它包含了最流行的开源项目的一些工件。在内部开发中,可以设置额外的远程存储库来包含从内部开发模块中发布的工件。可以使用 settings.xml 中的  元素来配置这些额外的远程存储库。

确保单个的工件   将 Maven 2 用于项目构建时,依赖项解析通过一个集中的存储库确保只存在一个依赖性工件,而不考虑有多少项目或子项目引用该工件。这是多模块项目构建中一个重要的属性,因为包含多个工件会导致一些项目一致性和集成方面的问题。
  存储库和坐标
  Maven 2 存储库存储 Maven 在一个项目的依赖项解析中使用过的工件集。在本地磁盘上访问本地存储库,通过网络访问远程存储库。
  工件通常被打包成包含二进制库或可执行库的 JAR 文件。这被认为是工件的一个类型。但在实践中,工件也可以是 WAR、EAR 或其他代码捆绑类型。
  Maven 2 利用操作系统的目录结构对存储在存储库中的工件集进行快速索引。这个存储库索引系统依赖于这种能力来通过工件的坐标 惟一标识工件。
  Maven 坐标
  Maven 坐标是一组可以惟一标识工件的三元组值。坐标包含了下列三条信息:


  • 组>:代表制造该工件的实体或组织。例如,com.ibm.devworks 就是一个组>

  • 工件>:实际的工件的名称。例如,主体类名为 OpsImp 的项目也许会用 OpsImp 作为其工件>

  • 版本:该工件的版本号。支持的格式为 mmm.nnn.bbb-qqqqqqq-dd ,其中, mmm 是主版本号, nnn 是次版本号, bbb 代表其 bug 修复水平。 qqqqq (限定词)或 dd (构建号)也能添加到版本号中,这两项是可选项。
  对 Maven 坐标的使用贯穿于 Maven 配置文件和 POM 文件中。例如,要在命名为 OpsImp 的模块上指定项目依赖项(在 1.0-SNAPSHOT 级别),pom.xml 文件应包含清单 1 所示的部分:
  
清单 1. OpsImp 样例模块的 Maven 坐标
  

  

  

  

  com.ibm.devworks
  OpsImp
  1.0-SNAPSHOT
  

  

  

  

  特别限定词 SNAPSHOT 告诉 Maven 2:该项目或模块还处于开发状态中,它应该获取最新版的可用工件。
  要将该项目指定为依赖于 JUnit 进行单元测试,可以将 JUnit 3.8.1 的坐标作为一个依赖项添加到该项目的 pom.xml 文件中,如清单 2 所示:
  
清单 2. JUnit 依赖项的 Maven 坐标
  

  

  

  

  junit
  junit
  3.8.1
  

  

  

  


深入 Maven 存储库   由于 Maven 存储库是普通的目录树,所以可以很容易地看到工件是如何存储到磁盘上的。图 3 是本地存储库的一部分,显示了 JUnit 3.8.1 工件的位置:
  
图 3. Maven 2 存储库内幕
  
DSC0002.gif
  从图 3 中可以看出,Maven 维护了一个工件的 POM 文件,同时也为该工件和其存储库中的 POM 维护了检验和散列。当工件在存储库间转移时,这些文件帮助确保工件的完整性。该工件已由 Maven 的依赖项管理引擎从中央存储库下载并放置到本地存储库中。
  在图 4 中,坐标为 com.ibm.devworks/OpsImp/1.0-SNAPSHOT 的工件显示在本地存储库中。该工件和 POM 文件一起存放在存储库。在本例中,该工件在本地安装。
  
图 4. 本地存储库中的 OpsImp 工件
  
DSC0003.gif
  Maven 2 生命周期、阶段、插件和 mojo
  Maven 通过插件动作完成大多数构建任务。可以把 Maven 引擎认为是插件动作的协调器。
  插件中的 Mojo
  插件是适应 Maven 的插件框架的软件模块。现在,可以使用 Java、Ant 或 Beanshell 来创建自定义插件。插件中的每个任务称作一个 mojo。有时,插件也被视为一套相关的 mojo。创建自定义的 Maven 2 插件超出了本教程的范围。
  Maven 2 是预先打包好的,以便于下载,它和许多常用插件一起使用。大多数典型开发任务不需要使用额外插件。
  在开始编写自己的插件前,您应该先参考一下列出流行 Maven 2 插件的 Web 站点,看一下您需要的插件是不是已经有了。图 5 显示了 Maven Plugin Matrix,它提供了许多可用插件的兼容性信息:
  
图 5. Maven Plugin Matrix
  
DSC0004.gif
  


将 mojo 绑定到生命周期各阶段  Maven 引擎在执行构建生命周期中相应的阶段时,执行插件中的 mojo(构建任务)。插件的 mojo 和生命周期中的阶段间的关联叫做绑定 。插件开发人员能够灵活地将一个或多个生命周期阶段和一个插件关联起来。

默认的生命周期的各阶段  Maven 对构建生命周期的固定理解包含了许多不同的阶段。表 1 简短地描述了各个阶段:
  
表 1. Maven 2 默认生命周期的各阶段
  

生命周期阶段
描述
验证
确保当前配置和 POM 的内容是有效的。这包含对 pom.xml 文件树的验证。
初始化
在执行构建生命周期的主任务之前可以进行初始化。
生成源码
代码生成器可以开始生成在以后阶段中处理或编译的源代码。
处理源码
提供解析、修改和转换源码。常规源码和生成的源码都可以在这里处理。
生成资源
可以生成非源码资源。通常包括元数据文件和配置文件。
处理资源
处理非源码资源。修改、转换和重定位资源都能在这阶段发生。
编译
编译源码。编译过的类被放到目标目录树中。
处理类
处理类文件转换和增强步骤。字节码交织器和常用工具常在这一阶段操作。
生成测试源码
mojo 可以生成要操作的单元测试代码。
处理测试源码
在编译前对测试源码执行任何必要的处理。在这一阶段,可以修改、转换或复制源代码。
生成测试资源
允许生成与测试相关的(非源码)资源。
处理测试资源
可以处理、转换和重新定位与测试相关的资源。
测试编译
编译单元测试的源码。
测试
运行编译过的单元测试并累计结果。
打包
将可执行的二进制文件打包到一个分布式归档文件中,如 JAR 或 WAR。
前集成测试
准备集成测试。这种情况下的集成测试是指在一个受到一定控制的模拟的真实部署环境中测试代码。这一步能将归档文件部署到一个服务器上执行。
集成测试
执行真正的集成测试。
后集成测试
解除集成测试准备。这一步涉及测试环境重置或重新初始化。
检验
检验可部署归档的有效性和完整性。过了这个阶段,将安装该归档。
安装
将该归档添加到本地 Maven 目录。这一步让其他可能依赖该归档的模块可以使用它。
部署
将该归档添加到远程 Maven 目录。这一步让这个工件能为更多的人所用。  Maven 从开源社区中汲取了十多年的项目构建管理经验。很难找到一个构建周期不符合表 1 中的生命周期阶段的软件项目。
  启动 Maven 2 引擎后,它会按顺序经历表 1 中的各阶段,执行可能与该阶段绑定的 mojo。每个 mojo 则可以使用 Maven 2 丰富的 POM 支持、依赖项管理,也可以访问执行这一专门任务时的构建状态信息。
  调用 Maven 2 引擎时,可以将一个生命周期阶段指定为命令行参数。该引擎一直执行到指定的阶段(包括该指定的阶段)。包含的阶段中所有的 mojo 都会被触发。
  简短地说,这就是 Maven 2 的操作原理。



运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-640887-1-1.html 上篇帖子: apache和iis 下篇帖子: apache支持.shtml
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表