【Maven教程】(一)入门介绍篇:Maven基础概念与其他构建工具:理解构建过程与Maven的多重作用,以及与敏捷开发的关系 ~

Maven入门介绍篇

  • 1️⃣ 基础概念
      • 1.1 构建
      • 1.2 maven对构建的支持
      • 1.3 Maven的其他作用
  • 2️⃣ 其他构建工具
      • 2.1 IDE
      • 2.2 Make
      • 2.3 Ant
      • 2.4 Jenkins
  • 3️⃣ Maven与敏捷开发
  • 🌾 总结

在这里插入图片描述

1️⃣ 基础概念

"Maven"可以翻译为 “知识的积累者” 或 “专家”。这个词源于波斯语,意为广受尊重和富有智慧的人。在软件开发领域中,Maven作为Apache 组织中的一个颇为成功的开源项目,它是一个非常流行的构建工具,它在项目管理、依赖管理和构建自动化方面提供了强大的功能和支持。因此,Maven 被视为软件开发过程中的权威专家,能够帮助开发团队更高效地构建和管理项目。

无论是小型的开源类库项目还是大型的企业级应用,无论是传统的瀑布式开发还是流行的敏捷模式,Maven都能展现其出色的能力。

1.1 构建

其实作为程序员,我们每天都在进行构建(build)工作。上班后的第一件事就是从源代码库中拉取最新的代码,并进行单元测试。如果测试失败,我们会与同事合作进行调试修复。然后我们继续自己的工作,编写单元测试和产品代码。

忙碌到中午,代码编写基本完成,测试也通过了,我们开心地享用午餐并稍作休息。下午开始有些困倦的时候,我们参加例会,会议结束后喝杯咖啡继续工作。刚才在会议中经理要求查看测试报告,于是我们将相关工具集成到IDE中,生成漂亮的测试覆盖率报告,然后发邮件给经理,松了口气。但QA小组又提交了几个bug,没办法,我们先在本地重现,然后熟练地用IDE生成一个WAR包,部署到Web容器中启动进行测试。一步步复现问题,最后在下班前修复了bug,提交代码并通知QA小组,愉快地结束了一天的工作。

回想一下,除了编写源代码,我们每天也花很多时间来进行编译、运行单元测试、生成文档、打包和部署等繁琐的工作,也就是构建。如果仍然依赖手工完成这些步骤,成本将会非常高。因此,有人通过使用软件方法完全自动化这一系列工作,使得软件构建像流水线一样自动进行,只需简单的一条命令,所有繁杂的步骤都能够自动完成,很快就能得到最终结果。

1.2 maven对构建的支持

上面就介绍了Maven 的用途之一是服务于构建,它是一个强大的构建工具,能够帮我们完成自动化构建过程,从清理、编译、测试到生成报告,再到打包和部署。我们不需要一遍遍地输入命令, 我们要做的是使用Maven 配置好项目,然后输入简单的命令(如 mvn clean install),Maven 就会帮我们处理那些烦琐的任务。

Maven是一个跨平台的构建工具,这意味着不管是在WindowsLinux还是Mac上,我们都可以使用相同的命令进行构建。

我们一直在努力寻找避免重复的方法,包括设计、编码、文档以及构建的重复。而Maven最大程度地消除了构建过程中的重复性工作。它抽象了构建生命周期,并提供了许多已实现的插件来完成大部分构建任务。我们不再需要定义过程,甚至不需要实现其中的一些任务。举个简单的例子,对于测试来说,我们只需要按照Maven的约定编写好测试用例,当进行构建时,这些测试会自动运行,无需告诉Maven如何执行测试。

想象一下,Maven抽象了一个完整的构建生命周期模型,吸取了其他构建脚本和工具的优点,并总结了大量项目的实际需求。如果我们遵循这个模型,在很多情况下可以避免许多不必要的错误。此外,我们可以直接使用许多成熟的Maven插件来完成任务。

总的来说,Maven作为一个构建工具,具有自动化构建的能力,同时还能够提供抽象的构建过程和已实现的构建任务。它的跨平台特性以及提供一致操作接口的特点,使其成为出色且广受欢迎的构建工具。

1.3 Maven的其他作用

图1 Maven的logo

Maven不只是一个构建工具,还是一个依赖管理及项目信息管理工具,它通过提供中央仓库来支撑开发者自动下载组件。

在当今开源的编程时代,几乎所有的Java应用都会使用一些第三方的开源类库,这些类库可以通过依赖的方式引入到项目中。然而,随着依赖的增加,就可能会出现版本不一致、版本冲突、依赖臃肿等问题。手动解决这些问题非常繁琐,但幸运的是Maven为我们提供了一个优秀的解决方案。通过依赖坐标系统,Maven能够精确定位每一个组件(比如jar文件),使类库世界变得有秩序。借助Maven,我们可以有序地管理依赖,轻松解决复杂的依赖问题。

此外,Maven还帮助我们有效管理项目中分散在各个角落的项目信息,包括项目描述、开发者列表、版本控制系统地址、许可证、缺陷管理系统地址等等。这些微小的变化可能看起来不起眼,但却在不知不觉中节省了大量查找信息的时间。除了直接的项目信息,Maven还生成网站和提供一些已有插件,使我们轻松获得有价值的项目信息,比如项目文档、测试报告、静态分析报告、源码版本日志报告等。

另外,Maven还为全球的Java开发者提供了一个免费的中央仓库,在这个仓库中几乎可以找到任何流行的开源类库。通过一些衍生工具(如Nexus),我们甚至可以快速搜索中央仓库。只要提供坐标,Maven就能自动下载所需的文件,省去了手工操作的麻烦。

最后,使用Maven还能享受一个额外的好处,即Maven为项目提供了规范的目录结构、测试用例命名方式等。只要按照这些成熟的规则进行开发,切换项目时无需额外学习,符合"约定优于配置"的原则。

2️⃣ 其他构建工具

Maven 不是Java 领域唯一的构建管理的解决方案。本节将通过一些简单的例子解释Maven的必要性,并介绍其他构建解决方案,如IDEMakeAnt, 并将它们与 Maven 进行比较。

2.1 IDE

我们不能否认优秀的集成开发环境(IDE)可以极大地提高开发效率。主流的IDEEclipseNetBeans等,提供了强大的文本编辑、调试和重构功能。尽管使用简单的文本编辑器和命令行也可以完成大部分开发工作,但很少有人愿意这样做。然而,IDE却存在一些缺陷:

  • IDE依赖繁琐的手工操作。编译、测试、代码生成等任务相互独立,很难通过一键操作来完成所有工作,手动操作效率低下;
  • 在项目中统一所有的 IDE配置是很困难的。每个开发者都有自己的配置偏好,正是由于这个原因,一个在A机器上成功运行的任务,在B机器上的 IDE中可能会失败。

因此,我们应该合理利用IDE,而不是过度依赖它。对于构建这类任务,反复点击鼠标在 IDE中操作是不够智能的行为。Maven是在这方面专业的工具,并且主流的 IDE已经集成了Maven,因此我们可以在 IDE中方便地运行Maven进行构建操作。

2.2 Make

Make可能是最早的构建工具,由Stuart Feldman于1977年在贝尔实验室创建。由于这个贡献,他在2003年获得了ACM国际计算机组织颁发的软件系统奖。目前,Make有许多衍生实现,包括最流行的GNU MakeBSD Make,还有Windows平台上的Microsoft nmake等。

Make由一个名为 Makefile的脚本文件驱动,该文件使用Make定义的自己的语法格式。它的基本组成部分包括一系列规则(Rules),每条规则包括目标(Target)、依赖(Prerequisite)和命令(Command)。Makefile的基本结构如下:

target: prerequisitecommand

Make通过一系列目标和依赖将整个构建过程串联起来,并利用本地命令完成每个目标的实际操作。它的强大之处在于可以利用各种系统的本地命令,尤其是UNIX/Linux系统,这些功能丰富且强大的命令能够帮助 Make快速高效地完成任务。

然而,Make也存在一些限制:它将自己与操作系统绑定在了一起。换句话说,使用Make很难(至少较为困难)实现跨平台构建,对于Java来说,这非常不友好。此外,Makefile的语法也经常成为问题,很多人抱怨 Make构建失败的原因往往是由于难以察觉的空格或制表符(Tab)使用错误导致的。

2.3 Ant

Ant(Another Neat Tool)是一个构建工具,最初用于构建著名的 Tomcat 服务器。它的创作动机源于James Duncan Davidson 对 Makefile语法格式的不满。我们可以将Ant 视为Java版本的 Make,正因为使用了Java,Ant是跨平台的。此外,Ant使用XML来定义构建脚本,相对于Makefile来说更加友好。

类似于MakeAnt 也有一个构建脚本 build.xml,示例如下:

<?xml version="1.0"?>
<project name="Hello"	default="compile"><target name="compile" description="compile the Java source code to class files"><mkdir dir="classes'/><javac srcdir="." destdir="classes"/></target><target name="jar" depends="compile" description="create a Jar file"><jar destfile="hello,jar"><fileset dir="classes" includes="**/s.class"/><manifest><attribute name="Main-Class" value="HelloProgram"/></manifest></jar></target>
</project>

build.xml 的基本结构包括目标(target)、依赖(depends)以及实现目标的任务。例如,在上述脚本中,jar目标用于创建应用程序的 jar文件,该目标依赖于compile目标。compile目标执行的任务是在当前目录编译Java文件并将其输出到一个名为classes的文件夹中。当compile目标完成后,jar目标接着执行自己的任务。

Ant内置了大量用Java实现的任务,这确保了它的跨平台特性。此外,Ant 还提供了特殊的exec任务用于执行本地命令。

Make 一样,Ant 也都是过程式的,开发者显式地指定每一个目标,以及完成该目标所需要执行的任务。针对每一个项目,开发者都需要重新编写这一过程,这里其实隐含着很大的重复行为。 而Maven 是声明式的,项目构建过程和过程各个阶段所需的工作都由插件实现, 并且大部分插件都是现成的,开发者只需要声明项目的基本元素, Maven 就执行内置的、 完整的构建过程,这在很大程度上减少了重复性。

在过去的一段时间里,Ant 没有提供依赖管理功能,这意味着Ant用户不得不手动管理依赖关系,这是一个很麻烦的问题。幸运的是,现在Ant用户可以使用Ivy来管理依赖关系。对于Maven用户来说,依赖管理是最基本的,因为Maven内置了强大的依赖管理功能。此外,Maven还拥有一个中央仓库,可能是全世界最大的Java开源软件包集合,因此Maven用户无需进行任何配置即可直接享受依赖管理的好处。

2.4 Jenkins

图2 Jenkins的logo

Jenkins是一个开源的自动化工具,用于构建、测试和部署软件项目。它提供了一种简单且可扩展的方式来设置和管理软件交付流程。

相比于Maven,Jenkins更加强大且灵活。通过使用Jenkins,你可以在软件开发过程中自动化执行各种任务和工作流程,并监视其执行情况。下面是一些Jenkins的核心功能:

  1. 自动化构建和持续集成:Jenkins允许你在代码提交后自动触发构建过程,并检查代码质量、运行单元测试等。这有助于减少手动操作和加快构建发布周期。

  2. 插件生态系统:Jenkins拥有丰富的插件生态系统,使你可以轻松地扩展其功能。这些插件包括与其他工具的集成、生成报告、发送通知等。例如,你可以使用Maven插件将Maven生成的结果集成到Jenkins中并展示。

  3. 流水线管理:Jenkins支持基于流水线的软件交付流程定义和管理。使用Jenkins Pipeline插件,你可以以可编程的方式定义整个交付流程,包括构建、测试、部署和回滚等步骤。

  4. 可视化报告:Jenkins能够将各个阶段的结果以图表的形式展示出来,包括构建情况、测试覆盖率、代码质量等。这使得开发人员和项目经理可以更方便地查看和分析项目的状态和趋势。

通过Jenkins,你可以实现更高效的软件交付过程,并为团队提供实时可视化的项目状态信息。它提供了一个集中化的平台,以管理和执行各种工作流程,节省了配置和维护不同工具之间的复杂性。

本专栏主要介绍Maven,那么对于同样重要的 Jenkins技术,后续我会专门做一个专栏做更详细的知识介绍,请大家持续关注。

3️⃣ Maven与敏捷开发

首先需要了解,敏捷开发(Agile Development)是一种软件开发方法理论,旨在通过迭代、协作和灵活性来应对变化的需求。它强调快速响应变更、频繁交付可工作的软件以及与客户紧密合作等核心原则。

而极限编程(Extreme Programming)则是敏捷开发中一种具体的实践方法之一,其目标是提供高质量的软件解决方案,并通过团队合作和持续反馈来增加生产效率。极限编程强调快速迭代、自动化测试、简单设计、持续集成以及面向人员的价值观等重要实践。

下面看一下 Maven 是如何适应极限编程的。

  • 简单性。Maven 暴露了一组一致且简洁的操作接口,能帮助团队成员从原来高度自定义的、复杂的构建系统中解脱出来,使用Maven 现有的成熟稳定的组件,也能简化构建系统的复杂度;
  • 交流与反馈。与版本控制系统结合后,所有人都能执行最新的构建并快速得到反馈。此外,自动生成的项目报告也能帮助成员了解项目的状态,促进团队的交流;
  • 测试驱动开发 (TDD)。TDD 强调测试先行,所有产品都应该由测试用例覆盖。而测试是Maven 生命周期的最重要的组成部分之一,并且 Maven 有现成的成熟插件支持 业界流行的测试框架,如 JUnitTestNG
  • 快速构建。快速构建强调我们能够随时快速地从源码构建出最终的产品。这正是Maven 所擅长的,只需要一些配置,之后用一条简单的命令就能让 Maven 帮你清理、编译、测试、打包、部署,然后得到最终的产品;
  • 持续集成 (CI) 。CI 强调项目以很短的周期(如15分钟)集成最新的代码。实际上, CI 的前提是源码管理系统和构建系统。流行的CI 服务器如 HudsonCruiseControl 都能很好地和 Maven 进行集成。也就是说,使用Maven 后,持续集成会变得更加方便;
  • 富有信息的工作区。强调开发者能够快速方便地了解到项目的最新状态。 当然, Maven 并不会帮你把测试覆盖率报告贴到墙上,也不会在你的工作台上放个鸭子告诉你构建失败了。不过使用Maven 发布的项目报告站点,并配置你需要的项目报告,如测试覆盖率报告,都能帮你把信息推送到开发者眼前。

上述这些实践并非只在极限编程中适用。事实上,除了其他敏捷开发方法如 SCRUM 之外,几乎任何软件开发方法都能借鉴这些实践。也就是说, Maven 几乎能够很好地支持任何软件开发方法。

例如,在传统的瀑布模型开发中,项目依次要经历需求开发、分析、设计、编码、测试和集成发布阶段。从设计和编码阶段开始,就可以使用 Maven 来建立项目的构建系统。 在设计阶段,也完全可以针对设计开发测试用例,然后再编写代码来满足这些测试用例。 然而,有了自动化构建系统,我们可以节省很多手动的测试时间。此外,尽早地使用构建系统集成团队的代码,对项目也是百利而无一害。最后, Maven 还能帮助我们快速地发布项目。

🌾 总结

本文从概念上简单地介绍了一下Maven, 通过本章我们应该能大致了解Maven 是什么以及它有什么用途。我们还将Maven 与其他流行的构建工具(如Make 和 Ant等) 做了一些对比分析。如果你没用过Maven, 但有Make 或者 Ant 的使用经验,相信通过比较你能更清楚地了解各种工具的优劣势,并且会对Maven 有一个理性的认识。

将 Maven 和敏捷开发与极限编程结合起来分析是为了让大家从另 一个角度了解Maven, 毕竞软件开发离不开对于软件过程的理解。希望大家积极理解 Maven并从中受益。


继续阅读下一篇(点击跳转)
《》

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

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

相关文章

Qt应用开发(基础篇)——MDI窗口 QMdiArea QMdiSubWindow

一、前言 QMdiArea类继承于QAbstractScrollArea&#xff0c;QAbstractScrollArea继承于QFrame&#xff0c;是Qt用来显示MDI窗口的部件。 滚屏区域基类 QAbstractScrollAreahttps://blog.csdn.net/u014491932/article/details/132245486 框架类 QFramehttps://blog.csdn.net/u01…

FANUC机器人加减速倍率指令ACC的使用方法说明

FANUC机器人加减速倍率指令ACC的使用方法说明 单位有一台FANUC机器人(型号:M-900iB 360kg),偶尔会在启动的瞬间会报SRVO-050碰撞检测报警,而事实上机器人并没有开始移动或和其他工件产生碰撞,一直查了很长时间,也没有查到具体的原因,也尝试过重新进行负载推算,但是偶尔…

恒运资本:CPO概念发力走高,兆龙互联涨超10%,华是科技再创新高

CPO概念15日盘中发力走高&#xff0c;截至发稿&#xff0c;华是科技涨超15%再创新高&#xff0c;兆龙互联涨逾11%&#xff0c;中贝通讯涨停&#xff0c;永鼎股份、太辰光涨超5%&#xff0c;天孚通讯涨逾4%。 消息面上&#xff0c;光通讯闻名咨询机构LightCounting近日发布的202…

国产之光:讯飞星火最新大模型V2.0

大家好&#xff0c;我是herosunly。985院校硕士毕业&#xff0c;现担任算法研究员一职&#xff0c;热衷于机器学习算法研究与应用。曾获得阿里云天池比赛第一名&#xff0c;CCF比赛第二名&#xff0c;科大讯飞比赛第三名。拥有多项发明专利。对机器学习和深度学习拥有自己独到的…

每天一道leetcode:1466. 重新规划路线(图论中等广度优先遍历)

今日份题目&#xff1a; n 座城市&#xff0c;从 0 到 n-1 编号&#xff0c;其间共有 n-1 条路线。因此&#xff0c;要想在两座不同城市之间旅行只有唯一一条路线可供选择&#xff08;路线网形成一颗树&#xff09;。去年&#xff0c;交通运输部决定重新规划路线&#xff0c;以…

OpenCV-Python中的图像处理-视频分析

OpenCV-Python中的图像处理-视频分析 视频分析Meanshift算法Camshift算法光流Lucas-Kanade Optical FlowDense Optical Flow 视频分析 学习使用 Meanshift 和 Camshift 算法在视频中找到并跟踪目标对象: Meanshift算法 Meanshift 算法的基本原理是和很简单的。假设我们有一堆…

python优雅地爬虫!

背景 我需要获得新闻&#xff0c;然后tts&#xff0c;在每天上班的路上可以听一下。具体的方案后期我也会做一次分享。先看我喜欢的万能的老路&#xff1a;获得html内容-> python的工具库解析&#xff0c;获得元素中的内容&#xff0c;完成。 好家伙&#xff0c;我知道我爬…

视频云存储/安防监控/视频汇聚EasyCVR平台新增设备经纬度选取

视频云存储/安防监控EasyCVR视频汇聚平台基于云边端智能协同&#xff0c;支持海量视频的轻量化接入与汇聚、转码与处理、全网智能分发、视频集中存储等。音视频流媒体视频平台EasyCVR拓展性强&#xff0c;视频能力丰富&#xff0c;具体可实现视频监控直播、视频轮播、视频录像、…

公网远程连接Redis数据库「内网穿透」

文章目录 1. Linux(centos8)安装redis数据库2. 配置redis数据库3. 内网穿透3.1 安装cpolar内网穿透3.2 创建隧道映射本地端口 4. 配置固定TCP端口地址4.1 保留一个固定tcp地址4.2 配置固定TCP地址4.3 使用固定的tcp地址连接 前言 洁洁的个人主页 我就问你有没有发挥&#xff0…

蓝牙资讯|苹果Apple Watch可手势操控Mac和Apple TV等设备

根据美国商标和专利局&#xff08;USPTO&#xff09;公示的清单&#xff0c;苹果公司近日获得了一项技术专利&#xff0c;概述了未来的 Apple Watch 手表&#xff0c;使用手势等操控 Mac 和 Apple TV 等设备。 该专利描述未来 Apple Watch 可以交互实现编辑图像、绘图、处理文…

02:STM32--EXTI外部中断

目录 一:中断 1:简历 2:AFIO 3:EXTI ​编辑 4:NVIC基本结构 5:使用步骤 二:中断的应用 A:对外式红外传感计数器 1:连接图​编辑 2:函数介绍 3:硬件介绍 4:计数代码 B;旋转编码计数器 1:连接图 2:硬件介绍 3:旋转编码器代码: 一:中断 1:简历 中断&#xff1a;在主程…

Flutter 测试小结

Flutter 项目结构 pubspec.yaml 类似于 RN 的 package.json&#xff0c;该文件分别在最外层及 example 中有&#xff0c;更新该文件后&#xff0c;需要执行的 Pub get lib 目录下的 dart 文件为 Flutter 插件封装后的接口源码&#xff0c;方便在其他 dart 文件中调用 example 目…

python通过S7协议读取西门子200smart数据

发现网上很多关于python通过s7协议控制200smart的代码都失败&#xff0c;我猜应该是版本的问题。自己捣鼓了半天&#xff0c;终于测试成功 from snap7 import util,clientmy_plc client.Client() #建立一个客户端对象 my_plc.set_connection_type(3) #如果是200smart,必须有此…

QT实现天气预报

1. MainWindow类设计的成员变量和方法 public: MainWindow(QWidget* parent nullptr); ~MainWindow(); protected: 形成文本菜单来用来右键关闭窗口 void contextMenuEvent(QContextMenuEvent* event); 鼠标被点击之后此事件被调用 void mousePressEvent(QMouseEv…

Leetcode每日一题:1444. 切披萨的方案数(2023.8.17 C++)

目录 1444. 切披萨的方案数 题目描述&#xff1a; 实现代码与解析&#xff1a; 二维后缀和 动态规划 原理思路&#xff1a; 1444. 切披萨的方案数 题目描述&#xff1a; 给你一个 rows x cols 大小的矩形披萨和一个整数 k &#xff0c;矩形包含两种字符&#xff1a; A …

Spring(三):Spring中Bean的生命周期和作用域

前言 在 Spring 中&#xff0c;那些组成应用程序的主体及由 Spring IOC 容器所管理的对象&#xff0c;被称之为 bean。简单地讲&#xff0c;bean 就是由 IOC 容器初始化、装配及管理的对象&#xff0c;除此之外&#xff0c;bean 就与应用程序中的其他对象没有什么区别了。而 b…

LeetCode 热题 100(四):48. 旋转图像、240. 搜索二维矩阵 II、234. 回文链表

一.48. 旋转图像 题目要求&#xff1a;就是一个顺时针的旋转过程。 思路&#xff1a;观察矩阵&#xff0c;得出翻转前第i行的第J个元素 等于 翻转后倒数第i列的第J个元素&#xff0c;举例说明&#xff0c;第1行第2个元素为“2”&#xff0c;翻转后到了 倒数第1列的第2个元素…

MAC环境,在IDEA执行报错java: -source 1.5 中不支持 diamond 运算符

Error:(41, 51) java: -source 1.5 中不支持 diamond 运算符 (请使用 -source 7 或更高版本以启用 diamond 运算符) 进入设置 修改java版本 pom文件中加入 <plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-compiler-plugin&l…

vue项目预览pdf功能(解决动态文字无法显示的问题)

最近&#xff0c;因为公司项目需要预览pdf的功能&#xff0c;开始的时候找了市面上的一些pdf插件&#xff0c;都能用&#xff0c;但是&#xff0c;后面因为pdf变成了需要根据内容进行变化的&#xff0c;然后&#xff0c;就出现了需要动态生成的文字不显示了。换了好多好多的插件…

Flink安装与使用

1.安装准备工作 下载flink Apache Flink: 下载 解压 [dodahost166 bigdata]$ tar -zxvf flink-1.12.0-bin-scala_2.11.tgz 2.Flinnk的standalone模式安装 2.1修改配置文件并启动 修改&#xff0c;好像使用默认的就可以了 [dodahost166 conf]$ more flink-conf.yaml 启动 …