版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
开源软件构建技术——开源软件构建方法《开源软件构建技术:理论与实践》教材(电子工业出版社:ISBN978-7-121-52361-8)配套课件2课件使用介绍课程资源网站(正在建设中,持续更新维护):课程配套8个实践案例:/paths/krytlieb
部署在头歌平台,
关卡作答模式,平台配套实验环境。欢迎老师在头歌平台新建课堂,引入课程实验案例资源。3.课程部分互动,学生作答环节(投票题),需要下载安装“雨课堂”应用。
提到“软件构建”,你脑海中第一印象是什么?像盖房子一样:打地基(架构)、砌砖(写代码)、装门窗(接口)、最后验收(测试)程序员在电脑前专注地敲代码、调试、解决Bug的过程一堆需求文档、设计图、流程图,以及严格的开发流程和规范一个充满创造性和可能性的过程,就像用数字积木搭建独特的功能世界ABCD提交1课堂互动:大家对“软件构建”的理解是什么?3投票最多可选4项什么是软件构建41软件构建的基本概念:什么是软件构建?5软件构建是指将项目的源代码和资源转化为可执行的软件产品的过程。在软件开发中,项目构建是一个重要的阶段,它将源代码编译、测试、打包和部署,最终生成可部署或可交付的软件应用或库。2
DevOps简介:DevOps定义6DevOps是一种融合软件开发(Development)和IT运维(Operations)的文化、实践和工具集。旨在缩短开发周期,提高交付速度,增强软件质量和可靠性。DevOps不是一种具体的技术,而是一种理念,核心目标是自动化和协作,以提升软件开发和部署的效率,同时减少因传统开发与运维分离而导致的问题。2
DevOps简介:DevOps起源72
DevOps简介:敏捷开发的兴起82001年,《敏捷宣言》的发布标志着软件开发领域的一次重大变革。敏捷开发的核心理念是通过迭代式开发、持续交付和跨职能团队协作,使软件开发过程更加灵活、快速,并能够更好地响应需求变化。特征1:迭代式开发特征2:持续反馈特征3:跨职能团队协作特征4:快速响应变化2
DevOps简介:敏捷开发的兴起9敏捷开发在开发阶段取得了显著成效,但它主要关注的是从需求到代码的实现过程,而并未覆盖到运维阶段。问题1:“开发快、上线慢”的矛盾。问题2:缺乏持续交付的支持。问题3:开发与运维的目标冲突。2
DevOps简介:DevOps概念的提出10
2008年,比利时工程师PatrickDebois在探讨"敏捷基础设施"时,发现开发与运维的割裂严重阻碍软件交付效率。提出核心思想:通过协作文化与自动化工具弥合开发(Dev)与运维(Ops)的鸿沟。2009年,Patrick在比利时根特发起首届"DevOpsDays"大会,聚集开发、运维等多领域从业者。会议中正式提出"DevOps"概念,聚焦协作改进软件交付流程,该术语由此迅速风靡全球。2
DevOps简介:DevOps的推广与演进11DevOps自2009年提出后,通过互联网巨头(如Google/Amazon/Facebook)在2010年后的实践推动CI/CD、微服务与云计算落地;2013年《凤凰项目》出版并提出"流动-反馈-持续学习"三步工作法,奠定理论基石;2015年后容器化革命(Docker实现环境一致性)、云原生技术(Kubernetes编排微服务、Serverless抽象基础设施)的爆发,最终形成自动化部署、弹性伸缩、无人值守运维的成熟体系,完成从理念到方法论再到技术生态的完整演进闭环。2
DevOps简介:DevOps生命周期12DevOps生命周期是一个持续迭代、闭环的自动化流程,旨在通过增强团队协作实现软件的高效、可靠交付。它始于计划阶段的需求拆解与任务定义,接着进入开发(编码、构建、测试)阶段将需求转化为经过验证的代码包;随后在部署阶段(发布、部署)将稳定的应用安全推送到生产环境;最后在运营阶段(运营、监控)保障应用稳定运行、收集用户反馈与性能数据,并将这些关键洞察持续反馈回新的计划阶段,驱动产品的持续优化与改进,从而形成一个完整的、自驱动的闭环。2
DevOps重要组件131.持续集成(CI):高频代码合并,避免“集成地狱”2.持续交付/部署(CD):实现自动化发布到生产环境
2
DevOps重要组件144.自动化测试:集成于CI/CD,单元/集成/端到端测试3.基础架构即代码(IaC)
:自动化管理和部署基础设施5.监控与日志:实时监控指标+日志分析+可视化
2
DevOps关键技术15DevOps体系通常采用系列工具链和技术架构,以支持软件开发、构建、测试、部署、监控和运维等各个环节,其主要涉及的工具链和关键技术包括如下几个部分:
3主流构建工具:目前主流的构建工具是什么?16MakeCMakeMavenGradleBazel3
Maven的简介:Maven是什么?17Maven这个词可以翻译为“知识的积累”,也可以翻译为“专家”或“内行”,是Apache软件基金会开发的项目管理和构建工具,主要用于Java项目的管理。Maven采用声明式配置,通过pom.xml定义项目的构建生命周期、依赖管理和插件扩展。
核心特性1:成熟稳定核心特性2:约定优于配置核心特性3:中央仓库核心特性4:插件生态系统3
Maven的安装与验证18第一步(检查JDK版本):按“win+r”输入“cmd”打开命令行窗口,输入“java-version”命令检查JDK版本。目前主流使用的Maven版本均为3.3+,需要JDK1.7(对应JavaSE7)或更高版本。3
Maven的安装与验证19第二步(下载Maven):进入官方网站“”,在首页点击“Downloads”跳转至下载maven界面,直接点击“apache-maven-3.9.11-bin.zip”进行下载。完成后可直接解压到自己选择的路径(路径最好不带中文)。3
Maven的安装与验证20第三步(配置环境变量):打开电脑设置,系统——>系统信息——>高级系统设置——>环境变量,系统变量下面点击“新建(w)...”,填写变量名和变量值(下载的maven文件中bin文件的根目录路径)后点击“确定”。3
Maven的安装与验证21第三步(配置环境变量):接着在系统变量中找到名为“Path”的变量,选中后点击“编辑(I)...”,点击“新建(N)”,并填入%MAVEN_HOME(刚刚新建的变量名)%\bin,最后点击“确定”即可。3
Maven的安装与验证22第四步(验证安装):按“win+r”输入“cmd”打开命令行窗口,运行“mvn-v”命令查看maven版本,如果可以弹出则安装成功。4
Maven的使用:仓库体系231)在本地存储库中搜索依赖,若未找到,则转到第2步,否则执行进一步处理。2)如果没有提到远程存储库,则跳转到第3步。在一个或多个远程存储库中搜索依赖项,如果找到则将其下载到本地存储库以供将来参考。3)在中央存储库中搜索依赖,将其下载到本地存储库以供将来参考。如果未找到Maven只是停止处理并抛出错误(无法找到依赖)。4
Maven的使用:配置本地仓库与远程仓库241)找到apache-maven-3.8.1\conf目录下的用户设置文件setting.xml并打开。2)通过<localRepository>配置本地仓库位置,如不配置则本地仓库默认路径为${user.home}/.m2/repository。3)由于中央仓库国内访问较慢,需配置阿里云镜像的远程仓库,在<mirrors>标签中写下的阿里云<mirror>标签4
Maven的使用:Maven项目基本属性与标准目录25groupID:定义当前Maven项目的项目名称artifactID:定义当前Maven项目的模块名称version:定义Maven项目当前所处的版本package:项目初始化后java包名,通常与groupID一致文件查看打开隐藏的项目即可见idea创建Maven项目命令行创建Maven项目4
Maven的使用:创建Maven项目26命令行方式:打开命令行并进入想要创建项目的路径下,执行“mvnarchetype:generate”命令,选择archetype:7(回车使用默认),输入groupId:com.example,输入artifactId:my-project,输入version:1.0-SNAPSHOT(回车使用默认),输入package:com.example(回车默认使用
groupId充当包名)4
Maven的使用:创建Maven项目27命令行方式:构建成功可以看到“BUILDSUCCESS”标识,并且在创建路径下会多出一个以Maven项目模块命名的文件下。4
Maven的使用:创建Maven项目28idea创建方式:打开idea设置,搜索Maven,配置maven主路径(maven存放的位置),配置用户设置文件路径(apache-maven-3.8.1\conf\setting.xml),配置本地仓库路径,均完成后点击“确定”。点击新建项目,构建系统选择为Maven即可完成创建Maven项目。groupIDartifactID4
Maven的使用:坐标定位29此maven项目当前处于快照版本此maven项目名称(默认与包名一致)此maven模块名称4
Maven的使用:指定依赖关系30项目开发过程中需要的依赖,例如添加Mysql的JDBC驱动(<dependency>标签内为依赖坐标定位)标准的初始化maven项目文件目录坐标定位信息4
Maven的使用:Maven命令mvncompile31使用编译命令前使用编译命令后4
Maven的使用:Maven命令mvntest32在pom.xml文件中添加junit单元测试依赖。4
Maven的使用:Maven命令mvntest33在test文件下建立测试类(命名需以Test开头)并编写一个测试函数。4
Maven的使用:Maven命令mvntest34执行mvntest命令后可以看到成功的个数,新增test-classes文件夹,存放编译后的测试类。4
Maven的使用:Maven命令mvnpackage35使用打包命令前使用打包命令后4
Maven的使用:Maven命令mvninstall36执行命令后可在本地仓库找到项目的JAR包4
Maven的使用:Maven命令mvnclean37使用清除命令前使用清除命令后4
Maven的使用:依赖范围38通过<scope>标签控制依赖范围4
Maven的使用:依赖传递机制39此maven项目当前处于快照版本
直接依赖:
子模块A
子模块B
在子模块A(子模块可直接在右键maven新建模块)的pom.xml文件中使用<dependency>标签(标签内为子模块B的坐标定位信息)直接依赖子模块B。4
Maven的使用:依赖传递机制40
直接依赖:
子模块A
子模块B
在子模块A的pom.xml文件中使用<dependency>标签(标签内为子模块B的坐标信息)直接依赖子模块B。子模块A通过直接依赖子模块B得到servlet依赖4
Maven的使用:依赖传递机制41
间接依赖:
子模块A
子模块B
在子模块A的pom.xml文件中使用<dependency>标签(标签内为子模块B的坐标信息)直接依赖子模块B。在子模块B的pom.xml文件中使用<dependency>标签(标签内为子模块C的坐标信息)直接依赖子模块C。从而实现子模块A间接依赖于子模块C。子模块A通过直接依赖子模块B得到servlet依赖
子模块C4
Maven的使用:依赖传递机制42
间接依赖:
子模块A
子模块B
子模块C
子模块A直接依赖子模块B,间接依赖子模块C,不仅得到子模块B的servlet依赖,也得到了子模块C的mysql依赖。由此可知,依赖传递机制是不管Maven项目存在多少间接依赖,POM中都只需要定义其直接依赖,不必定义任何间接依赖,Maven会动读取当前项目各个直接依赖的POM,将那些必要的间接依赖以传递性依赖的形式引入到当前项目中。4
Maven的使用:依赖仲裁策略43
子模块A
子模块B
子模块C
依赖X(v8.3.0)
子模块A
子模块D
依赖X(v8.2.0)X是A的间接依赖,但是两条依赖路径上有两个版本的X,那么哪个X会被A解析使用呢?4
Maven的使用:依赖仲裁策略44
运行mvndependency:tree-Dverbose查看子模块A的依赖树
最短路径优先:路径长度最短的会被加载。A->B->C->X(V8.3.0)路径长度为3A->D->X(V8.2.0)路径长度为2
所以X(V8.2.0)会被加载4
Maven的使用:依赖仲裁策略45
子模块A
子模块B
子模块C
依赖X(v8.3.0)
子模块A
子模块D
依赖X(v8.2.0)X是A的间接依赖,但是两条依赖路径上有两个版本的X,那么哪个X会被A解析使用呢?
子模块E4
Maven的使用:依赖仲裁策略46
运行mvndependency:tree-Dverbose查看子模块A的依赖树
第一声明者优先:若路径长度相同时,最先声明的会被加载。A->B->C->X(V8.3.0)路径长度为3A->D->E->X(V8.2.0)路径长度为3
路径长度一样,都为3,但A->B->C->X(V8.3.0)优先声
明所以X(V8.3.0)会被加载4
Maven的使用:依赖仲裁策略47
依赖锁定:通过在子模块A中pom.xml文件中添加dependencyManagement标签统一依赖X版本(v8.0.33)。
子模块A
子模块B
子模块C
依赖X(v8.3.0)
子模块A
子模块D
依赖X(v8.2.0)
子模块E4
Maven的使用:依赖仲裁策略48
运行mvndependency:tree-Dverbose查看子模块A的依赖树
使用dependencyManagement标签统一的依赖管理有利于项目后期依赖的升级(只需修改一处,即依赖的固定版本,无需将每个子模块中的依赖版本都修改)和维护。4
Maven的使用:依赖仲裁策略49
<dependencyManagement>标签中内部<dependencies>标签声明的依赖不会自动引入到项目模块中,只有通过在其外部<dependencies>标签中声明了同样的包(包括依赖传递),才会引入到模块中。外部<dependencies>标签声明的版本将覆盖<dependencyManagement>中的声明,若外部<dependencies>中声明的包没有指明版本,则使用<dependencyManagement>中声明的版本。内部<dependencies>外部<dependencies>内部<dependencies>外部<dependencies>
依赖引入版本为8.2.0
依赖引入版本为8.0.334
Maven的使用:继承50子模块A通过<parent>标签继承父POM的配置(标签内为父POM坐标定位)maven模块中添加子模块A(直接右键maven模块后点击新建后选择模块)子模块A父POM4
Maven的使用:继承51mavenA子模块A与maven模块依赖项保持一致4
Maven的使用:聚合52通过<modules>定义多模块项目maven模块中添加子模块A和子模块B子模块A子模块B4
Maven的使用:聚合53maven模块聚合子模块A与子模块B4
Maven的使用:插件扩展54maven模块聚合子模块A与子模块BMaven插件(Plugin)是Maven生态中的核心扩展组件,用于在构建过程中执行特定的任务(如编译代码、运行测试、打包文件、部署等)。通过将插件绑定到Maven的生命周期阶段,它实现了标准化构建流程与高度可定制化能力的平衡。4
Maven的使用:SuperPOM55执行命令生成有效POM4
Maven的使用:SuperPOM56
Maven内置一个隐式的SuperPOM,所有项目的pom.xml均继承自该文件,提供默认配置(如负责编译Java源代码的maven-compiler-plugin插件绑定等)。子模块A执行编译(运行mvncompile命令)子模块A有效POM4
Maven的使用:打包方式57此maven项目当前处于快照版本<packaging>标签用于定义Maven项目的打包方式,打包方式:多模块项目的父POM为“pom”,Maven插件为“maven-plugin”、普通Maven项目为“jar”以及Web类项目为“war”,而不写<packaging>标签则默认打包方式为“jar”。5依赖常见问题与管理策略:依赖冲突问题58此maven项目当前处于快照版本
问题描述:软件项目中由直接依赖或间接依赖引入了两个不同版本的相同软件库而导致构建或运行时产生错误。例子中如果Maven选择了3.8版本,而代码中使用了3.12的新方法(如StringUtils.isEmpty()),则会抛出NoSuchMethodError。管理策略:1.统一版本管理:在父POM的<dependencyManagement>中强制指定版本,覆盖传递依赖的版本。2.显式排除冲突依赖:使用<exclusions>移除低版本传递依赖。3.依赖调解规则:调整依赖声明顺序或缩短依赖路径。5依赖常见问题与管理策略:依赖冲突问题59此maven项目当前处于快照版本
子模块A子模块example-libcommons-lang3:3.8commons-lang3:3.12
移除版本传递依赖在父POM强制指定版本5依赖常见问题与管理策略:冗余依赖问题60问题描述:软件项目中由不同依赖库引入了完全相同的依赖项或项目中并没有使用到的依赖项、从而导致构建时间和打包体积增加。例子中依赖spring-boot-starter-web会传递性引入jackson-databind。如果项目中已经显式声明了jackson-databind,会导致依赖的重复引入,造成冗余依赖问题。管理策略:1.排除不必要的依赖:使用<exclusions>移除不需要的传递依赖。2.利用mvndependency:analyze命令进行检测,人工检查其依赖配置。5依赖常见问题与管理策略:冗余依赖问题61此maven项目当前处于快照版本
子模块Aspring-boot-starter-web:2.7.0jackson-databind:2.7.0
移除版本传递依赖mvndependency:analyze命令检测jackson-databind:2.7.05依赖常见问题与管理策略:作用域置错误62问题描述:作用域配置错误而导致运行时类缺失或无关依赖泄漏的场景,其常见问题包括:①将由运行环境提供的依赖(如servlet-api)配置为compile,导致打包时包含该依赖,并在运行时与服务器提供的版本冲突。②将仅用于测试的依赖(如JUnit)配置为compile,导致无用的测试类或调试工具被引入生产环境。③将运行时必需但编译时无须参与的依赖(如数据库驱动)配置为provided,导致应用启动时导致ClassNotFoundException错误。例子中将servlet-api的作用域错误地配置为compile,导致打包时包含该依赖,但在运行时与服务器提供的servlet-api冲突。正确的作用域设置应为provided。管理策略:严格配置作用域:根据依赖用途选择正确的<scope>:1)compile(默认):参与编译、测试、运行。2)provided:由容器提供(如servlet-api)。3)test:仅用于测试代码。4)runtime:不参与编译,但参与运行。5依赖常见问题与管理策略:快照版本不稳定63问题描述:快照版本通常用于开发过程中,表示该版本仍在持续演进,因此在项目构建过程中可能会引发因迭代而导致的构建结果无法重现、运行时因版本更新引发代码错误以及因本地仓库和远程仓库中快照版本缓存不一致的问题。例子中依赖my-lib:1.0-SNAPSHOT,每次构建时Maven都会尝试下载最新快照版本,可能导致构建结果不一致。管理策略:1.生产环境禁用快照版本:发布时使用正式版本(如1.0.0而非1.0-SNAPSHOT)。2.定期清理本地快照缓存:使用mvnclean命令定期清理本地快照缓存,避免本地残留旧版本。5依赖常见问题与管理策略:循环依赖64问题描述:两个或多个项目(或模块)之间相互依赖,形成一个循环。具体而言,项目A依赖于项目B,项目B又依赖于项目A,形成了一个依赖环,从而导致,Maven在构建过程中无法解析其依赖关系或造成类加载异常的问题。例子中模块A依赖模块B,模块B又依赖模块A,形成循环依赖。管理策略:1.重构模块设计:将公共代码提取到独立模块C,使之模块A和模块B都依赖于模块C。2.使用接口解耦:通过引入接口而不是具体实现,可以减少模块之间的直接依赖。模块之间依赖于接口而不是实现类,从而降低耦合度。项目B项目A5依赖常见问题与管理策略:依赖版本不一致65问题描述:在多模块项目开发过程中,不同子模块在多人开发的过程中因开发习惯或不严格的版本规定,导致项目不同子模块中依赖了同一个软件库的不同版本。例子中父项目依赖了软件库junit:5.8.1,但子模块显式声明了junit:4.13.2,导致版本不一致。管理策略:1.父POM统一管理版本:在父POM的<dependencyManagement>中定义版本,在POMB中进行版本的设置,在POMD的子模块中继承父模块的所有依赖。2.使用属性变量:通过<properties>标签集中管理版本号。5依赖常见问题与管理策略:建议采取策略661.通过父POM的<dependencyManagement>集中定义版本、利用属性变量和官方BOM确保一致性;2.使用<exclusions>精准排除冲突传递依赖,并借助mvndependency:tree分析依赖树;3.严格按需配置compile、provided、test、runtime作用域以隔离依赖;4.优化模块设计(提取公共模块、接口抽象)避免循环依赖;5.严禁生产环境使用SNAPSHOT版本并定期清理仓库缓存,从而显著提升构建的稳定性和可维护性。6
实践:简介67相信到这里,你已经学会了Maven的下载安装与环境配置,以及使用Maven在本地进行引入依赖、依赖传递以及解决依赖冲突的基本工作流程以及相关操作。接下来可以打开头歌平台的课程,通过一个简单的案例实践,来体会Maven的强大功能:/6实践:简介68提升学生对Maven多模块项目依赖管理的理解,掌握依赖传递机制,并学习如何解决版本冲突问题。其中实验环境中已包含Maven,无需自行安装。任务分为5个关卡,每个关卡设置不同的任务,通过这5个关卡,你将完整地实践Maven项目管理依赖的基本工作流程,掌握Maven的基本操作!6
实践:第1关69第1关:Maven项目创建并提交至远程仓库在这一关中,你需要:了解运行相关git命令完成克隆仓库以及创建一个Maven项目的操作。了解创建的Maven项目提交到仓库。6
实践:第1关参考步骤70第1步:克隆远程仓库第2步:进入仓库目录下第3步:创建Maven项目6
实践:第1关参考步骤71第4步:选择archetype:7第5步:填写项目基本信息第6步:将创建的Maven项目提交到仓库6
实践:第2关72第2关:Maven项目创建并提交至远程仓库在这一关中,你需要:在【pom.xml】文件引入Junit单元测试依赖,并在【AppTest.java】文件中编写一个功能函数。在【AppTest.java】中使用Junit框架进行功能函数的测试。6
实践
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 领导深入基层工作制度
- 风险分级监管工作制度
- 高速服务投诉工作制度
- 绥化市肇东市2025-2026学年第二学期五年级语文第八单元测试卷(部编版含答案)
- 巢湖市无为县2025-2026学年第二学期三年级语文第八单元测试卷(部编版含答案)
- 信阳市固始县2025-2026学年第二学期五年级语文第七单元测试卷(部编版含答案)
- 周口市沈丘县2025-2026学年第二学期三年级语文期末考试卷(部编版含答案)
- 膨胀烟丝设备操作工安全实践强化考核试卷含答案
- 钨酸铵溶液制备工操作知识竞赛考核试卷含答案
- 广播电视线务员岗前理论实践考核试卷含答案
- 2026湖南省博物馆编外工作人员公开招聘笔试备考试题及答案解析
- ivd行业市场分析2026报告
- DB44∕T 2792-2025 城镇内涝风险评估与治理技术标准
- 创建鲁班奖工程实施指南
- 2026四川成都双流区面向社会招聘政府雇员14人备考题库带答案详解
- 2026万基控股集团有限公司招聘50人笔试模拟试题及答案解析
- 2025版建筑工程建筑面积计算规范
- 2026江苏省人民医院行风监督处管理辅助岗招聘1人考试备考题库及答案解析
- 2026一季度重庆市属事业单位公开招聘242人参考考试试题及答案解析
- 2026年社会学概论试题库200道附答案【能力提升】
- 志愿服务与社区建设:共建共治共享的基层治理新实践
评论
0/150
提交评论