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

news2024/11/22 17:33:48

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: prerequisite
    command

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.coloradmin.cn/o/882738.html

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

相关文章

【第三阶段】kotlin语言空合并操作符

1.空操作符&#xff1f;&#xff1a; xxx?:“如果是null执行” 如果xxx是null&#xff0c;就执行?:后面的逻辑&#xff0c;如果不是null就执行&#xff1f;&#xff1a;前面的逻辑&#xff0c;后面的不在执行 fun main() {var name:String?"kotlin" namenullvar …

【数据结构OJ题】反转链表

原题链接&#xff1a;https://leetcode.cn/problems/reverse-linked-list/description/ 目录 1. 题目描述 2. 思路分析 3. 代码实现 1. 题目描述 2. 思路分析 方法一&#xff1a;三指针翻转法 使用三个结构体指针n1&#xff0c;n2&#xff0c;n3&#xff0c;原地修改结点…

移动端直播相关技术总结

一、直播APP原理 二、直播APP架构 三、直播APP实现流程 四、流媒体开发 流媒体模块架构 流媒体相关基础知识 帧&#xff1a;每一帧代表一幅静止的图像 GOP&#xff1a;Group of Pictures&#xff0c;画面组&#xff0c;一个GOP就是一组连续的画面&#xff0c;很多帧的集合 码率…

腾讯Perfdog支持Windows PC端体验性能测试

一、背景 最近在做抖音的小玩法&#xff0c;其基于unity引擎&#xff0c;然后挂载到直播伴侣。以及Perfdog近期也支持了Windows的测试&#xff0c;所以做一个体验测试。 二、如何做 查看PC端的支持&#xff0c;目前是beat版本 选择或搜索自己需要的对应的程序&#xff0c;如…

Allegro172版本如何在联机模式下使用skill文件操作指导

Allegro172版本如何在Symphony模式下使用skill文件操作指导 在用Allegeo172版本进行PCB设计的时候,有时会用到Symphony模式进行多人实时在线协同设计,如下图 这个模式设计起来可以提升设计速度,但是也有一个缺陷,就是不能使用skill文件 如下图,当调用skill的时候就会出现…

Aspera替代方案:探索这些安全且可靠的文件传输工具

科技的发展日新月异&#xff0c;文件的传输方式也在不断地更新换代。传统的邮件附件、FTP等方式已经难以满足人们对于传输速度和安全性的需求了。近年来&#xff0c;一些新兴的文件传输工具受到了人们的关注&#xff0c;其中除了知名的Aspera之外&#xff0c;还有许多可靠安全的…

全志H616交叉编译,orangepi-zero2

文章目录 交叉编译是什么为什么需要交叉编译&#xff1f; 宿主机和目标机所需工具解压编译工具临时有效&#xff0c;配置环境变量&#xff08;切换终端无效&#xff09;永久有效&#xff0c;配置环境变量大功告成开始测试拷入文件测试结束 交叉编译是什么 交叉编译&#xff1a…

《Learning Combinatorial Optimization Algorithms over Graphs》阅读笔记

一.文章概述 本文提出将强化学习和图嵌入的组合以端到端地自动为图上组合优化问题设计贪心启发式算法&#xff0c;以避免设计传统算法所需要的大量专业知识和试错。学得的贪心策略行为类似增量构造解决方案的元算法&#xff0c;动作由解决方案当前状态上的图嵌入网络确定。作者…

『清安无别事-赠书01期』|〖测试设计思想〗

目录 &#x1f9e1; 内容简介 &#x1f49b; 作者简介 &#x1f496; 本书内容|目录 &#x1f497; 读后感想 &#x1f49d; 参与方式 购书传送门&#xff1a;测试设计思想购书传送门&#xff1a;测试设计思想购书传送门&#xff1a;测试设计思想 &#x1f9e1; 内容简介 …

Win10提醒事项如何打开?电脑上如何添加日程提醒?

有不少上班族表示自己在日常办公时&#xff0c;经常会忘记一些重要的事情&#xff0c;例如领导安排给自己的任务、会议安排、项目截止日期等。为了避免自己忘记工作事项&#xff0c;很多人都想要在电脑上设置提醒事项或添加日程提醒。那么Win10提醒事项如何打开呢&#xff1f;P…

LCS最大公共子序列 与 LIS最大递增子序列

LCS Largest Common Subsequence 最大公共子序列 /* Input s1 s2//两个字符串Output length//长度 ans//具体字母 */ #include<iostream> using namespace std; int main() {string s1,s2;cin>>s1>>s2;int dp[100][100]{0};//dp[i][j]表示s1取前i位&#x…

软件工程概述-架构师(三)

软件工程概述&#xff08;老版&#xff09; 软件开发生命周期&#xff1a; 软件定义时期&#xff1a;包括 可行性研究和详细需求分析过程&#xff0c;任务是软件工程必需完成的目标&#xff0c;具有可行问题分析、可行性研究、需求分析等。软件开发时期&#xff1a;软件的 设…

css浮动(为什么要清除浮动?清除浮动有哪几种方式?)

为什么要清除浮动&#xff1f; 清除浮动主要是为了清除浮动元素造成的影响&#xff0c;使浮动元素不会影响其后元素的布局 防止父元素高度塌陷&#xff1a;当元素浮动后&#xff0c;它会脱离一个标准文档流&#xff0c;不再占用原先的布局空间。如果一个父元素内只有浮动元素&a…

SpringBoot中优雅的实现隐私数据脱敏(提供Gitee源码)

前言&#xff1a;在实际项目开发中&#xff0c;可能会对一些用户的隐私信息进行脱敏操作&#xff0c;传统的方式很多都是用replace方法进行手动替换&#xff0c;这样会由很多冗余的代码并且后续也不好维护&#xff0c;本期就讲解一下如何在SpringBoot中优雅的通过序列化的方式去…

07 线程学习

一 qt线程角色 子线程完成与UI线程无关的工作,并且能够保持与UI线程通信 二 qt中线程 在QT中,对于 线程操作也是提供类(QThread)来进行封装,然后再学习该类的API接口 参数用途Header:#include qmake:QT += coreInherits:QObject //继承于QObject从官方文档可以看出,如果一…

每天一道leetcode:797. 所有可能的路径(图论中等深度优先遍历)

今日份题目&#xff1a; 给你一个有 n 个节点的 有向无环图&#xff08;DAG&#xff09;&#xff0c;请你找出所有从节点 0 到节点 n-1 的路径并输出&#xff08;不要求按特定顺序&#xff09; graph[i] 是一个从节点 i 可以访问的所有节点的列表&#xff08;即从节点 i 到节…

[论文笔记]Glancing Transformer for Non-Autoregressive Neural Machine Translation

引言 这是论文Glancing Transformer for Non-Autoregressive Neural Machine Translation的笔记。 传统的非自回归文本生成速度较慢,因为需要给定之前的token来预测下一个token。但自回归模型虽然效率高,但性能没那么好。 这篇论文提出了Glancing Transformer,可以只需要一…

Verdi_traceX and autotrace

Verdi_traceX and autotrace Trace X From nWave/nTrace of from the Teporal Flow View. Show Paths on Flow ViewShow Paths on nWave 若Waveform中有X态&#xff0c;鼠标右键会有Trace X的选项&#xff1b; 会自动打开Temporal Flow View窗口&#xff0c;展示对应路径&am…

我的创作纪念日 — 嵌入式up(2023.8.15)

机缘 在2022年8月15日&#xff0c;开始了CSDN文章的编写&#xff0c;最初只想做一个知识的积累&#xff0c;毕竟对一个电子发烧友来说&#xff0c;很多东西都是迭代很快&#xff0c;且玩的次数不会很多&#xff0c;有些问题和一些解决方法&#xff0c;最好记录下来&#xff0c;…

分类预测 | MATLAB实现EVO-CNN多输入分类预测

分类预测 | MATLAB实现EVO-CNN多输入分类预测 目录 分类预测 | MATLAB实现EVO-CNN多输入分类预测预测效果基本介绍程序设计参考资料 预测效果 基本介绍 1.MATLAB实现EVO-CNN多输入分类预测 2.代码说明&#xff1a;量谷优化卷积神经网络的数据分类预测&#xff1a;要求于Matlab …