当前位置: 首页 > news >正文

【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并从中受益。


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

相关文章:

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

Maven入门介绍篇 1️⃣ 基础概念1.1 构建1.2 maven对构建的支持1.3 Maven的其他作用 2️⃣ 其他构建工具2.1 IDE2.2 Make2.3 Ant2.4 Jenkins 3️⃣ Maven与敏捷开发&#x1f33e; 总结 1️⃣ 基础概念 "Maven"可以翻译为 “知识的积累者” 或 “专家”。这个词源于波…...

今天,谷歌Chrome浏览器部署抗量子密码

谷歌已开始部署混合密钥封装机制&#xff08;KEM&#xff09;&#xff0c;以保护在建立安全的 TLS 网络连接时共享对称加密机密。 8月10日&#xff0c;Chrome 浏览器安全技术项目经理Devon O’Brien解释说&#xff0c;从 8 月 15 日发布的 Chrome 浏览器 116 开始&#xff0c;谷…...

SUMO traci接口控制电动车前往充电站充电

首先需要创建带有停车位的充电站(停车场和充电站二合一)&#xff0c;具体参考我的专栏中其他文章。如果在仿真的某个时刻&#xff0c;希望能够控制电动车前往指定的充电站充电&#xff0c;并且在完成充电后继续前往车辆原来的目的地&#xff0c;那么可以使用以下API&#xff1a…...

现代CSS中的换行布局技术

在现代网页设计中&#xff0c;为了适应不同屏幕尺寸和设备类型&#xff0c;换行布局是一项重要的技术。通过合适的布局技术&#xff0c;我们可以实现内容的自适应和优雅的排版。本文将介绍CSS中几种常见的换行布局技术&#xff0c;探索它们的属性、代码示例和解析&#xff0c;帮…...

简单理解Python中的深拷贝与浅拷贝

I. 简介 深拷贝会递归的创建一个完全独立的对象副本&#xff0c;包括所有嵌套的对象&#xff0c;而浅拷贝只复制嵌套对象的引用&#xff0c;不复制嵌套对象本身。 简单来说就是两者都对原对象进行了复制&#xff0c;因此使用is运算符来比较新旧对象时&#xff0c;返回的都是F…...

C++之std::pair<uint64_t, size_t>应用实例(一百七十七)

简介&#xff1a; CSDN博客专家&#xff0c;专注Android/Linux系统&#xff0c;分享多mic语音方案、音视频、编解码等技术&#xff0c;与大家一起成长&#xff01; 优质专栏&#xff1a;Audio工程师进阶系列【原创干货持续更新中……】&#x1f680; 人生格言&#xff1a; 人生…...

前端打开后端返回的HTML格式的数据

前端打开后端返回的 HTML格式 的数据&#xff1a; 后端返回的数据格式如下示例&#xff1a; 前端通过 js 方式处理&#xff08;核心代码如下&#xff09; console.log(回调, path); // path 是后端返回的 HTML 格式数据// 必须要存进localstorage&#xff0c;否则会报错&am…...

How to deal with document-oriented data

Schema designData models for e-commerceNuts and bolts of databases, collection, and documents. Principles of schema design What are your application access pattern?Whats the basic unit of data? the basic unit of data is the BSON documentWhat are the ca…...

Http 状态码汇总

文章目录 Http 状态码汇总1xx&#xff08;信息性状态码&#xff09;2xx&#xff08;成功状态码&#xff09;3xx&#xff08;重定向状态码&#xff09;4xx&#xff08;客户端错误状态码&#xff09;5xx&#xff08;服务器错误状态码&#xff09; Http 状态码汇总 1xx&#xff08…...

mysql自定义实体类框架

根据表结构自动生产实体类和方法,根据反射与io生成,可自定义扩展方法 package com.digital.web.front; /*** pom依赖* <dependency>* <groupId>mysql</groupId>* <artifactId>mysql-connector-java</artifactId>* <version>5.1.27</ve…...

批量将Excel中的第二列内容从拼音转换为汉字

要批量将Excel中的第二列内容从拼音转换为汉字&#xff0c;您可以使用Python的openpyxl库来实现。下面是一个示例代码&#xff0c;演示如何读取Excel文件并将第二列内容进行拼音转汉字&#xff1a; from openpyxl import load_workbook from xpinyin import Pinyin # 打开Exce…...

消息推送:精准推送,提升运营效果,增添平台活力

对于app开发者而言&#xff0c;没有什么途径比消息推送更能直接、即时地触及目标用户群体了。消息推送与我们的日常生活息息相关&#xff0c;各种APP的状态和通知都通过消息推送来告知用户&#xff0c;引起用户的注意&#xff0c;吸引用户点开app。总而言之&#xff0c;推送服务…...

[保研/考研机试] KY43 全排列 北京大学复试上机题 C++实现

题目链接&#xff1a; 全排列https://www.nowcoder.com/share/jump/437195121692001512368 描述 给定一个由不同的小写字母组成的字符串&#xff0c;输出这个字符串的所有全排列。 我们假设对于小写字母有a < b < ... < y < z&#xff0c;而且给定的字符串中的字…...

Java将时间戳转化为特定时区的日期字符串

先上代码&#xff1a; ZonedDateTime dateTime ZonedDateTime.ofInstant(Instant.ofEpochMilli(System.currentTimeMillis()),zone ); //2019-12-01T19:01:4608:00String formattedDate dateTime.format(DateTimeFormatter.ofPattern("yyyy-MM-dd") ); //2019-12-…...

【算法挨揍日记】day03——双指针算法_有效三角形的个数、和为s的两个数字

611. 有效三角形的个数 611. 有效三角形的个数https://leetcode.cn/problems/valid-triangle-number/ 题目描述&#xff1a; 给定一个包含非负整数的数组 nums &#xff0c;返回其中可以组成三角形三条边的三元组个数。 解题思路&#xff1a; 本题是一个关于三角形是否能成立…...

通过 kk 创建 k8s 集群和 kubesphere

官方文档&#xff1a;多节点安装 确保从正确的区域下载 KubeKey export KKZONEcn下载 KubeKey curl -sfL https://get-kk.kubesphere.io | VERSIONv3.0.7 sh -为 kk 添加可执行权限&#xff1a; chmod x kk创建 config 文件 KubeSphere 版本&#xff1a;v3.3 支持的 Kuber…...

感觉和身边其他人有差距怎么办?

虽然清楚知识需要靠时间沉淀&#xff0c;但在看到自己做不出来的题别人会做&#xff0c;自己写不出的代码别人会写时还是会感到焦虑怎么办&#xff1f; 你是否也因为自身跟周围人的差距而产生过迷茫&#xff0c;这份迷茫如今是被你克服了还是仍旧让你感到困扰&#xff1f; 下…...

【C语言基础】宏定义的用法详解

&#x1f4e2;&#xff1a;如果你也对机器人、人工智能感兴趣&#xff0c;看来我们志同道合✨ &#x1f4e2;&#xff1a;不妨浏览一下我的博客主页【https://blog.csdn.net/weixin_51244852】 &#x1f4e2;&#xff1a;文章若有幸对你有帮助&#xff0c;可点赞 &#x1f44d;…...

微服务系列文章之 SpringBoot 最佳实践

Spring Boot 是一种广泛使用且非常流行的企业级高性能框架。 以下是一些最佳实践和一些技巧&#xff0c;我们可以使用它们来改进 Spring Boot 应用程序并使其更加高效。 Spring Boot 的四大核心 1、自动配置 针对很多Spring应用程序和常见的应用功能&#xff0c;Spring Boo…...

C++并发多线程--std::async、std::packaged_task和std::promise的使用

目录 1--std::async的使用 2--std::packaged_task的使用 3--std::promise的使用 1--std::async的使用 std::async用于启动一个异步任务&#xff0c;并返回一个std::future对象&#xff1b;std::future对象里含有异步任务线程入口函数的结果&#xff1b; std::launch::deferr…...

opencv-目标追踪

import argparse import time import cv2 import numpy as np# 配置参数 ap argparse.ArgumentParser() ap.add_argument("-v", "--video", typestr,help"path to input video file") ap.add_argument("-t", "--tracker", …...

【数据结构】 单链表面试题讲解

文章目录 引言反转单链表题目描述示例&#xff1a;题解思路代码实现&#xff1a; 移除链表元素题目描述&#xff1a;示例思路解析&#xff1a; 链表的中间结点题目描述&#xff1a;示例&#xff1a;思路解析代码实现如下&#xff1a; 链表中倒数第k个结点题目描述示例思路解析&…...

C++ string类的模拟实现

模拟实现string类不是为了造一个更好的轮子&#xff0c;而是更加理解string类&#xff0c;从而来掌握string类的使用 string类的接口设计繁多&#xff0c;故而不会全部涵盖到&#xff0c;但是核心的会模拟实现 库中string类是封装在std的命名空间中的&#xff0c;所以在模拟…...

Qt实现简单的漫游器

文章目录 Qt的OpenGL窗口GLSL的实现摄像机类的实现简单的漫游器 Qt的OpenGL窗口 Qt主要是使用QOpenGLWidget来实现opengl的功能。  QOpenGLWidget 提供了三个便捷的虚函数&#xff0c;可以重载&#xff0c;用来重新实现典型的OpenGL任务&#xff1a; paintGL&#xff1a;渲染…...

【c语言】文件操作

朋友们&#xff0c;大家好&#xff0c;今天分享给大家的是文件操作的相关知识&#xff0c;跟着我一起学习吧&#xff01;&#xff01; &#x1f388;什么是文件 磁盘上的文件是文件。 但是在程序设计中&#xff0c;我们一般谈的文件有两种&#xff1a;程序文件、数据文件 程序文…...

【Unity】坐标转换经纬度方法(应用篇)

【Unity】坐标转换经纬度方法&#xff08;应用篇&#xff09; 解决地图中经纬度坐标转换与unity坐标互转的问题。使用线性变换的方法&#xff0c;理论上可以解决小范围内所以坐标转换的问题。 之前有写过[Unity]坐标转换经纬度方法&#xff08;原理篇),在实际使用中&#xff0c…...

element时间选择器el-date-picter使用disabledDate指定禁用的日期

需要的效果 <el-date-pickerclass"selectstyle"v-model"year"value-format"yyyy"type"year":picker-options"disabledCli"placeholder"选择年"> </el-date-picker>data() {return {disabledCli: {/…...

出学校干了 5 年外包,已经废了

如果不是女朋友和我提分手&#xff0c;我估计现在还没醒悟 本科大专&#xff0c;17年通过校招进入某软件公司做测试&#xff0c;干了接近5年的功能。 今年年初&#xff0c;感觉自己不能够在这样下去了&#xff0c;长时间呆在一个舒适的环境会让一个人堕落&#xff01;而我已经…...

day-23 代码随想录算法训练营(19)part09

669.修剪二叉搜索树 思路一&#xff1a;根据二叉搜索树的特性进行中间值与去区间值判断&#xff0c;有三种情况&#xff1a;1.在区间中&#xff0c;所以左右子树都可能在区间中&#xff1b; 2.在区间外面的左侧&#xff0c;必然只有右子树可能存在区间中&#xff1b;3.在区间外…...

JVM编译优化

即时编译器 HotSpot虚拟机中内置了两个即时编译器,分别称为Client Compiler和Server Compiler,或者简称为C1编译器和C2编译器。Java8默认开启Server模式。用户可以使用“-client”或“-server”参数去指定编译模式。 C1编译器启动速度快,关注局部简单可靠的优化,比如方法…...

vue浏览器插件安装-各种问题

方法1&#xff1a;vue.js devtolls插件下载 https://blog.csdn.net/qq_55640378/article/details/131553642 下载地址&#xff1a; Tags vuejs/devtools GitHub npm install 或是 cnpm install 遇到的报错 设置淘宝镜像源&#xff08;推荐使用nrm&#xff0c;这一步是为…...

maven工具-maven的使用-镜像仓库、本地仓、IDEA使用maven

Maven 一、为什么使用maven 添加第三方jar包jar包之间的依赖关系处理jar包之间的冲突获取第三方jar包将项目拆分成多个工程模块实现项目的分布式部署 二、maven简介 ​ Maven项目对象模型(POM)&#xff0c;可以通过一小段描述信息来管理项目的构建&#xff0c;报告和文档的…...

Mac鼠标增强工具Smooze Pro

Smooze Pro是一款Mac上的鼠标手势增强工具&#xff0c;可以让用户使用鼠标手势来控制应用程序和系统功能。 它支持多种手势操作&#xff0c;包括单指、双指、三指和四指手势&#xff0c;并且可以自定义每种手势的功能。例如&#xff0c;您可以使用单指向下滑动手势来启动Expos视…...

数据结构-单链表(C语言简单实现)

简介 以顺序结构进行数据存储时&#xff0c;它的特点就是可以用一组任意的存储单元存储数据元素&#xff0c;这组存储单元可以是连续的&#xff0c;也可以是不连续的&#xff0c;这些数据可以存在内存未被占用的任意位置。它也是有缺点的&#xff0c;就是在插入和删除时需要移…...

.netcore grpc身份验证和授权

一、鉴权和授权&#xff08;grpc专栏结束后会开启鉴权授权专栏欢迎大家关注&#xff09; 权限认证这里使用IdentityServer4配合JWT进行认证通过AddAuthentication和AddAuthorization方法进行鉴权授权注入&#xff1b;通过UseAuthentication和UseAuthorization启用鉴权授权增加…...

分布式 - 服务器Nginx:一小时入门系列之负载均衡

文章目录 1. 负载均衡2. 负载均衡策略1. 轮询策略2. 最小连接策略3. IP 哈希策略4. 哈希策略5. 加权轮询策略 1. 负载均衡 跨多个应用程序实例的负载平衡是一种常用技术&#xff0c;用于优化资源利用率、最大化吞吐量、减少延迟和确保容错配置。‎使用 nginx 作为非常有效的HT…...

Linux学习之基本指令二

-----紧接上文 在了解cat指令之前&#xff0c;我们首先要了解到Linux下一切皆文件&#xff0c;在学习c语言时我们就已经了解到了 对文件输入以及读入的操作&#xff08;向显示器打印&#xff0c;从键盘读取数据&#xff09;&#xff0c;对于Linux下文件的操作&#xff0c;也是…...

神经网络基础-神经网络补充概念-41-梯度的数值逼近

概念 梯度的数值逼近是一种用于验证梯度计算正确性的方法&#xff0c;它通过近似计算梯度来与解析计算的梯度进行比较。虽然数值逼近在实际训练中不常用&#xff0c;但它可以用来检查手动或自动求导的实现是否正确。 代码实现 import numpy as np# 定义函数 f(x) x^2 def f…...

tornado在模板中遍历二维数组

要在Tornado模板中遍历一个二维数组&#xff0c;你可以使用Tornado的模板语法来实现迭代和显示数组中的每个元素。 以下是一个示例&#xff0c;演示如何在Tornado模板中遍历和显示二维数组的内容&#xff1a; template.html: <!DOCTYPE html> <html> <head&g…...

前端-初始化Vue3+TypeScript

如果使用如下命令初始化项目&#xff0c;项目很干净&#xff0c;很适合了解项目的各个结构。 npm init vitelatest如果使用如下命令初始化项目&#xff0c;是可以选择你需要的组件 npm init vuelatest...

龙蜥社区安全联盟(OASA)正式成立,启明星辰、绿盟、360 等 23 家厂商重磅加入

7 月 28 日&#xff0c;由启明星辰、绿盟、360、阿里云、统信软件、浪潮信息、中兴通讯&#xff5c;中兴新支点、Intel、中科院软件所等 23 家单位共同发起的龙蜥社区安全联盟&#xff08;OASA&#xff0c;OpenAnolisSecurityAlliance&#xff09;&#xff08;以下简称“安全联…...

Flask-SQLAlchemy

认识Flask-SQLAlchemy Flask-SQLAlchemy 是一个为 Flask 应用增加 SQLAlchemy 支持的扩展。它致力于简化在 Flask 中 SQLAlchemy 的使用。SQLAlchemy 是目前python中最强大的 ORM框架, 功能全面, 使用简单。 ORM优缺点 优点 有语法提示, 省去自己拼写SQL&#xff0c;保证SQL…...

大数据bug-sqoop(二:sqoop同步mysql数据到hive进行字段限制。)

一&#xff1a;sqoop脚本解析。 #&#xff01;/bin/sh mysqlHost$1 mysqlUserName$2 mysqlUserPass$3 mysqlDbName$4 sql$5 split$6 target$7 hiveDbName$8 hiveTbName$9 partFieldName${10} inputDate${11}echo ${mysqlHost} echo ${mysqlUserName} echo ${mysqlUserPass} ec…...

Windows小记

一、域控制器升级的先决条件验证失败。 新建域时&#xff0c;本地 Administrator 帐户将成为域 Administrator 帐户。无法新建域&#xff0c;因为本地 Administrator 帐户密码不符合要求。 目前&#xff0c;本地 Administrator 帐户不需要密码。我们建议你使用网络用户命令行工…...

centos安装elasticsearch7.9

安装es 下载elasticsearch安装包解压安装包,并修改配置文件解压进入目录修改配置文件 添加用户&#xff0c;并修改所有者切换用户&#xff0c;运行es如何迁移旧版本的数据 下载elasticsearch安装包 下载地址如下&#xff0c;版本号可以替换成自己想要的。 这里需要注意一点&am…...

221、仿真-基于51单片机的智能啤酒发酵罐多点温度压力水位排水加水检测报警系统设计(程序+Proteus仿真+配套资料等)

毕设帮助、开题指导、技术解答(有偿)见文未 目录 一、硬件设计 二、设计功能 三、Proteus仿真图 ​编辑 四、程序源码 资料包括&#xff1a; 需要完整的资料可以点击下面的名片加下我&#xff0c;找我要资源压缩包的百度网盘下载地址及提取码。 方案选择 单片机的选择 方…...

C语言好题解析(三)

目录 选择题一选择题二选择题三选择题四编程题一编程题二 选择题一 以下程序段的输出结果是&#xff08;&#xff09;#include<stdio.h> int main() { char s[] "\\123456\123456\t"; printf("%d\n", strlen(s)); return 0; }A: 12 B: 13 …...

OpenCV之remap的使用

OpenCV中使用remap实现图像的重映射。 重映射是指将图像中的某一像素值赋值到指定位置的操作&#xff1a;g(x,y) f ( h(x,y) )&#xff0c; 在这里&#xff0c; g( ) 是目标图像, f() 是源图像, 而h(x,y) 是作用于 (x,y) 的映射方法函数。为了完成映射过程, 需要获得一些插值为…...

leetcode 377. 组合总和 Ⅳ

2023.8.17 本题属于完全背包问题&#xff0c;乍一看和昨天那题 零钱兑换II 类似&#xff0c;但细看题目发现&#xff1a;今天这题是排列问题&#xff0c;而“零钱兑换II”是组合问题。排列问题强调顺序&#xff0c;而组合顺序不强调顺序。 这里先说个结论&#xff1a;先遍历物品…...

C++笔记之花括号和圆括号初始化区别,列表初始化和初始化列表区别

C笔记之花括号和圆括号初始化区别&#xff0c;列表初始化和初始化列表区别 code review! 文章目录 C笔记之花括号和圆括号初始化区别&#xff0c;列表初始化和初始化列表区别1.花括号{}进行初始化和圆括号()进行初始化2.列表初始化&#xff08;list initialization&#xff0…...