Maven面试题

以下是一些关于Maven的经典面试题以及它们的答案: 

1、什么是Maven?

Maven是一个项目管理工具,用于构建、管理、发布Java项目。

2、为什么要使用Maven而不是手动管理项目依赖?

Maven提供了依赖管理、统一的构建、打包、文档生成等功能,能帮助开发者减少手动管理项目的繁琐和错误,提高了项目的可维护性和可靠性

3、Maven的生命周期是什么?以及各个阶段的含义是什么?

Maven的生命周期是指Clean、Build、Site三个阶段,每个阶段又有多个子阶段。Clean阶段负责清理项目;Build阶段负责编译、测试、打包、安装和部署项目;Site阶段负责生成项目的站点文档。Maven的构建生命周期按照Clean、Build、Site的顺序执行,每个阶段都有特定的Maven插件去执行具体的构建任务,Maven提供了许多默认的插件,同时也允许开发者自定义和扩展插件,以满足项目的特定需求。

  • Clean阶段。这个周期主要用于清理项目,删除上一次构建生成的target文件。它的主要阶段包括pre-clean、clean和post-clean。pre-clean执行一些需要在clean之前完成的工作,clean移除所有上一次构建生成的文件,post-clean执行一些需要在clean之后立刻完成的工作。
  • Default阶段。这个周期是构建和发布项目的核心部分,包括编译、测试、打包、安装和部署等步骤。它的主要阶段包括validate、compile、test、package、verify、install和deployvalidate验证项目结构和配置文件是否是完整的正确的可用的,compile将源代码编译为可执行的字节码,test使用单元测试框架测试编译后的源代码,package获取已编译的代码,并将其打包为可发布的格式,如JAR,verify验证包是否满足Maven的构建规范,install将包安装到本地仓库,以供其他项目使用,deploy将包部署到远程仓库。
  • Site阶段。这个周期主要用于生成和发布项目的站点文档。它的主要阶段包括pre-site、site、post-site和site-deploy。pre-site完成站点文档生成前的准备工作,比如创建目录结构、复制静态内容等,site生成项目的站点文档(在这个阶段,Maven会根据项目配置的站点文档生成插件,生成HTML、XML、PDF等格式的文档),生成的文档可以包含项目信息:如描述、开发者、许可证等,Javadocs:描述项目中的类、接口和方法,报告:如单元测试报告、代码覆盖率报告(代码覆盖率表示测试用例执行时覆盖的代码量与总代码量的比例)、代码质量报告等,依赖列表:列出项目使用的依赖,模块关系:如果项目是多模块的,这部分将展示各模块之间的关系,post-site用于完成生成站点文档后的附加工作,site-deploy将生成的站点文档部署到特定的服务器上。

4、Maven的依赖管理是什么?如何在POM文件中定义依赖?

Maven的依赖管理是指通过POM文件来管理项目的外部依赖库。可以在POM文件的dependencies标签下,使用groupId、artifactId和version来定义依赖。

  • groupId:这是项目组的标识。它在一个组织或者项目中通常是唯一的。
  • artifactId:这是项目的标识,通常是工程的名称。它在一个项目组(group)下是唯一的。
  • version:这是项目的版本号,用来区分同一个artifact的不同版本。

5、Maven的仓库是什么?有哪些仓库类型?

Maven的仓库是存储项目依赖库的地方。类型包括本地仓库、远程仓库、中央仓库、私有仓库、快照仓库(Snapshot版本)和发行仓库(Release 版本)等。

6、如何发布项目到私有仓库?

可以在Maven的settings.xml文件中配置私有仓库的URL和认证信息,然后使用mvn deploy命令来发布项目到私有仓库。

7、如何跳过单元测试的执行?

可以使用-DskipTests=true参数来跳过单元测试的执行,如mvn clean install -DskipTests=true

8、如何指定Maven使用的JDK版本?

第一种(最省事):在maven的conf目录下修改settings.xml文件,在profiles中加入以下配置,设置maven.compiler.sourcemaven.compiler.target来指定使用的JDK版本。

<profile>    
	<id>jdk-1.8</id>    
	<activation>    
		<activeByDefault>true</activeByDefault>    
		<jdk>1.8</jdk>    
	</activation>    
	<properties>    
		<maven.compiler.source>1.8</maven.compiler.source>    
		<maven.compiler.target>1.8</maven.compiler.target>    
		<maven.compiler.compilerVersion>1.8</maven.compiler.compilerVersion>    
	</properties>    
</profile>

第二种:在pom.xml中添加配置。

<properties>
    <maven.compiler.source>1.8</maven.compiler.source>
    <maven.compiler.target>1.8</maven.compiler.target>

    <maven.compiler.encoding>UTF-8</maven.compiler.encoding>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
</properties>

第三种:在pom.xml中添加配置,通过maven的插件实现。

<build>
  <plugins>
	<!-- 设置编译版本 -->
	<plugin>
	  <groupId>org.apache.maven.plugins</groupId>
	  <artifactId>maven-compiler-plugin</artifactId>
	  <configuration>
	    <source>1.8</source>
	    <target>1.8</target>
	    <encoding>UTF-8</encoding>
	  </configuration>
  </plugin>
</plugins>

9、描述一下Maven中的传递性依赖?如何排除传递性依赖?

Maven中的传递性依赖是指通过直接依赖间接依赖了其它的依赖库Maven会自动解析和加载这些传递性依赖。可以在POM文件的依赖声明中使用exclusions标签来排除传递性依赖。

10、如何创建一个Maven项目?

可以通过idea提供的菜单面板创建maven项目,也可以通过命令mvn archetype:generate创建。 

mvn archetype:generate
-DarchetypeGroupId=groupId
-DarchetypeArtifactId=artifactId
-DarchetypeVersion=version
-DgroupId=groupId
-DartifactId=artifactId
-Dversion=version

11、如何更新Maven依赖的版本?

可以使用mvn versions:update-parentmvn versions:use-latest-versions命令将项目中的依赖项更新到最新版本。如要显示项目中的依赖项是否有可用的更新版本,有命令mvn versions:display-dependency-updates 。

12、Maven中的optional和scope以及type作用?

optional

为true表示将依赖项设为可选,这样依赖该项目的项目,就不会引入该依赖,减少了依赖传递,避免依赖冲突,减小了jar和war体积,默认值为 false。 在某些情况下,项目可能依赖于两个或多个包含相互冲突的依赖项的库,通过将这些冲突的依赖项设置为可选,我们可以让项目显式地选择使用哪个版本,从而消除冲突。 

常见的有 spring-boot-devtools 热部署,junit 单元测试,lombok等生产环境下不需要的依赖包。

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-devtools</artifactId>
    <optional>true</optional>
</dependency>
<dependency>
    <groupId>junit</groupId>
    <artifactId>junit</artifactId>
    <version>4.12</version>
    <optional>true</optional>
</dependency>
<dependency>
    <groupId>org.projectlombok</groupId>
    <artifactId>lombok</artifactId>
    <optional>true</optional>
</dependency>

scope

scope 元素主要用来控制依赖的使用范围。

<scope>import</scope>的import只能在dependencyManagement中使用,且type必须为pom:

type

type:指明引入的依赖的类型(jar、war、pom等),默认jar。用到<scope>import</scope>时必须要声明<type>pom</type>。而<scope>import</scope>的import只能在dependencyManagement中用,所以<type>pom</type>常用在dependencyManagement标签中。

dependencyManagement标签用法会在本文章标题13中讲到。

13、Maven多模块项目中的继承和聚合有什么作用?

模块的“继承”

子 pom 通过继承父 pom 来复用父 pom的配置和依赖。

可继承的标签

可继承的标签太多了,不一一例举,这里就列一些我们在开发中常用的可继承的标签:

groupId、version:“项目所属组织”和“版本”可以继承(artifactId “模块名”不能继承)。
dependencies:“依赖”可以继承。
denpendencyManagement:“依赖管理”配置可以继承。

我们往往会把子模块中使用到的依赖以及版本号等,抽取到父模块中由子模块直接继承。

一般是用在最顶层的父pom,子模块继承之后锁定版本,能让所有的子模块中引用一个依赖而不用显式的列出版本号,Maven会沿着父子层向上走,直到找到一个拥有dependencyManagement元素的模块,然后他就会使用这个dependencyManagement元素中指定的版本号。这么做的好处就是,如果有多个子模块都引用同样的依赖,则可以避免在每个使用的子模块中的声明一个版本号。只需要在顶层父模块里更新,而不需要对子模块逐一进行修改,另外如果某个子项目中需要单独使用另外的版本,只需要在子模块中单独声明version即可dependencyManagement里面只是声明和限定依赖版本的,并未实现依赖的引入,因此子项目仍需要显式地声明所要引入的依赖如果不在子项目中声明依赖,是不会从父项目中继承下来的只有在子项目中引入了此依赖并且没有指定具体的版本号,才会从父项目中继承该项,并且version和scope都读取自父pom。如果子项目中定义了版本号,则会使用子项目中定义的版本号。

properties:“自定义属性”(类似于定义一个变量)可以继承。

repositories:仓库配置。

pom.xml文件中的 repositories 元素用于定义Maven构建系统在构建当前项目时从哪里获取依赖项。

<repositories>
    <repository>
        <id>central</id>
        <url>https://repo.maven.apache.org/maven2</url>
    </repository>
    <!-- 其他存储库的定义 -->
</repositories>

在这个例子中,repositories 包含了一个名为 “central” 的远程存储库,
该存储库的URL是Maven中央存储库的地址。
项目构建时,Maven将会在这个存储库中查找项目所需的依赖项。

将项目依赖的仓库信息直接定义在 pom.xml 中有一些优势:项目的构建不依赖于全局配置,可在不同环境中顺利构建,降低了对外部环境的依赖,使得项目更具可移植性

在实际的依赖项解析过程中,Maven按照以下顺序查找依赖项:本地仓库-->pom.xml 中的 repositories 标签配置的远程仓库--> Maven 配置文件 settings.xml 中的远程仓库配置-->
Maven内置默认仓库,例如 Maven Central Repository
。在这个过程中,一旦找到符合条件的依赖项,Maven就会停止搜索,避免不必要的网络请求。

distributionManagement:项目deploy的私服仓库配置。

build:插件、插件管理、源码输出位置等配置。

列举几个配置案例。

默认情况下,如果没有指定resources,自动会将classpath下的src/main/java下的.class文件和src/main/resources下的.xml文件放到target的classes文件夹下的package下的文件夹里。但如果设定了resources,那么默认的就会失效,就会以设置的为准。

pom.xml中的build标签的resources标签_pom build resources-CSDN博客

<resource>
    <directory>src/main/resources</directory>
</resource>

resource表示读取该目录的所有文件。

<resource>
  <directory>src/main/resources</directory>
  <filtering>true</filtering>
</resource>

filtering是否开启标签替换,无此标签表示不开启替换。若读取的文件中有类似${key}这样的配置,<filtering>true</filtering>就会从pom.xml中profiles的配置里面取。

<resource>
  <directory>src/main/resources</directory>
  <targetPath>META-INF/plexus</targetPath>
</resource>

targetPath用于指定读取资源到target的那个目录下,如下图,不指定默认为target/classes

<resource>
  <directory>src/main/resources</directory>
  <includes>
    <include>config/dubboSource/*.xml</include>
  </includes>
</resource>

includes表示仅读取directory文件夹下includes中指定的文件或文件夹的内容,即in的意思,如下图展示

<resource>
  <directory>src/main/resources</directory>
  <excludes>
    <exclude>config/dubboSource/*.xml</exclude>
  </excludes>
</resource>

excludes表示读取directory文件夹下但排除excludes中指定的文件或文件夹的所有其他内容,即not in的意思。

<testResources>
  <testResource>
    <directory>src/test/resources</directory>
    <filtering>true</filtering>
  </testResource>
</testResources>

testResources这个模块用来配置测试资源元素,其内容定义与resources类似。

子POM中引入父POM

父pom:

子pom引入父pom:

relativePath 指的是父 pom.xml 所在的相对路径,默认值是 ../pom.xml,如下图:
在这里插入图片描述

这也是 Maven 建议的目录组织形式,如果想将 parent模块 与 child 模块放到同一级目录,则需要修改为:<relativePath>../parent模块名/pom.xml</relativePath>,如下图:

模块的聚合

聚合(aggregation)用于按顺序批量构建子模块。

聚合的注意事项

在这个项目中,demo-a 依赖 demo-b, demo-b 依赖 demo-c , 在这种情况下,我们需要先 install c ,再 install b ,最后再构建 a,执行起来非常麻烦,为了处理这个问题,Maven 引入了聚合机制,可以将这三个模块聚合在一起,一次性完成构建。
聚合的语法也非常简单,只需要在父模块的 pom.xml 中添加 <modules> 即可:

<modules>
    <module>demo-a</module>
    <module>demo-b</module>
    <module>demo-c</module>
</modules>
<!-- 这里需要注意的是,<module> 中填写的并不是 artifactId,
而是需要被聚合的模块的 文件目录 的相对路径! -->

反应堆(reactor)

在一个多模块的Maven项目中,反应堆(Reactor)是指所有模块组成的一个构建结构,对于单模块的项目,反应堆就是该模块本身。我们使用上面聚合的项目来做一次构建:

mvn clean install

注意上面的执行顺序,先构建的是配置了聚合关系的父模块,然后才是子模块,子模块构建的时候会检查有没有依赖的模块,如果有就先构建被依赖的模块。所以这里按照被依赖的顺序,由底层向上层进行构建。因此,我们的模块之间不能出现循环依赖的情况,假如在demo-c中又引入demo-a的依赖,此时构建就会报错。

The projects in the reactor contain a cyclic reference: ......

在实际开发中,有时项目比较庞大,如果每次都完整的进行构建,耗时会很长。此时我们可以在构建指令上加上一些参数,以便于我们选择性的构建我们需要的项目,通过mvn -h查看。 

usage: mvn [options] [<goal(s)>] [<phase(s)>]

Options:
 -am,--also-make                        If project list is specified, also
                                        build projects required by the
                                        list
 -amd,--also-make-dependents            If project list is specified, also
                                        build projects that depend on
                                        projects on the list
 -B,--batch-mode                        Run in non-interactive (batch)
                                        mode (disables output color)
 -b,--builder <arg>                     The id of the build strategy to
                                        use
 -C,--strict-checksums                  Fail the build if checksums don't
                                        match
 -c,--lax-checksums                     Warn if checksums don't match
 -cpu,--check-plugin-updates            Ineffective, only kept for
                                        backward compatibility
 -pl,--projects <arg>          			Comma-delimited list of specified
										reactor projects to build instead
										of all projects. A project can be
										specified by [groupId]:artifactId
										or by its relative path

上面的-pl-am是比较常用的参数:

  • pl:指定构建某一个项目
  • am:构建项目的同时,构建它依赖的项目

假如我想指定构建demo-b及其依赖的模块demo-c,则可以用下面的指令:

mvn clean install -pl demo-b -am

14、Maven的插件是什么?如何配置插件?

插件是用于扩展Maven功能的工具,可以在项目的pom.xml文件中的build标签的子标签plugins中配置插件的参数来使用插件。

15、什么是Snapshot、Release版本?

Snapshot版本是指开发中的不稳定版本,用于表示项目的最新开发状态。一般来说Snapshot版本代表正在开发中的版本,而Release版本代表比较稳定的发布版本。

16、如何在Maven中配置插件?

在POM文件的build节点下使用插件块来配置插件。可以指定插件的groupId、artifactId、version,以及插件执行的目标等。

Maven中的profile是什么?如何使用profile?
Profile是一种Maven的特性,用于根据不同的环境配置来激活不同的构建选项。可以在POM文件中使用profile标签定义profile,并使用activation标签来指定profile的激活条件。

如何在Maven中跳过特定的构建阶段?
可以使用命令行参数或配置来跳过特定的构建阶段。例如,使用-Dmaven.test.skip=true参数可以跳过测试阶段。

Maven的聚合和继承有什么区别?什么时候使用聚合,什么时候使用继承?
聚合(aggregation)是将多个相互独立的模块组合成一个大项目。继承(inheritance)是使用父POM中的配置和依赖。聚合用于管理多模块项目,继承用于重用配置和依赖。

Maven中的插件管理是什么?如何在POM文件中配置插件管理?
插件管理是用于集中管理项目中使用的插件的配置。可以在POM文件的build节点下使用pluginManagement标签来配置插件管理,然后在plugins标签下配置具体的插件。

Maven中的依赖范围有哪些?
Maven的依赖范围包括:compile、provided、runtime、test和system。

Maven中的依赖冲突是什么?如何解决依赖冲突?
依赖冲突是指项目中多个依赖库引用了同一个依赖的不同版本,可能导致运行时的冲突。可以使用Maven的dependencyManagement机制来解决依赖冲突。

如何创建Maven插件?
可以使用Maven的插件骨架生成器(Maven Plugin Archetype Generator)来创建Maven插件的初始模板,并在模板基础上进行开发。 

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Unity(第二十四部)UI

在游戏开发中&#xff0c;用户界面&#xff08;UI&#xff09;是至关重要的一部分。它负责与玩家进行交互&#xff0c;提供信息&#xff0c;并增强游戏的整体体验。Unity 提供了强大的工具和功能来创建和管理 UI。 ui的底层就是画布&#xff0c;创建画布的时候会同时创建一个事…

rocketmq+rocket-dashboard win10安装部署+注册为Windows服务

1.1 首先去官网下载zip包 选择自己需要的版本 下载 | RocketMQ 1.2 、下载后&#xff0c;解压到指定目录 1.3、配置RocketMQ环境变量 注意&#xff0c;看对应的版本需要jdk版本 1.4、启动mqnameserver 进入bin目录下&#xff0c;双击启动mqnamesrv.cmd 启动后&#xff0c;…

11-Linux部署集群准备

Linux部署集群准备 介绍 在前面&#xff0c;我们所学习安装的软件&#xff0c;都是以单机模式运行的。 后续&#xff0c;我们将要学习大数据相关的软件部署&#xff0c;所以后续我们所安装的软件服务&#xff0c;大多数都是以集群化&#xff08;多台服务器共同工作&#xff…

喜报|迪捷软件入选工信部“2023年信息技术应用创新解决方案”

为进一步推进信创生态建设&#xff0c;激发产业自主创新活力&#xff0c;高效促进供需协同发展&#xff0c;加强区域联动和资源整合&#xff0c;国家工业和信息化部网络安全产业发展中心&#xff08;工业和信息化部信息中心&#xff09;联合相关单位&#xff0c;遴选了一批可复…

系统工程师面试问题,腾讯安卓开发面试

阿里面试需注意 1、面试前要做好充分的准备&#xff0c;一方面要尽可能多的搜集资料&#xff0c;对用人单位的历史、现状、规模、业务、产品、服务等方面要有所了解&#xff0c;掌握用人单位对人才的需求与使用情况&#xff1b;另一方面&#xff0c;要对照自己的实际情况&…

深入理解nginx的https alpn机制

目录 1. 概述2. alpn协议的简要理解2.1 ssl的握手过程2.2 通过抓包看一下alpn的细节3. nginx源码分析3.1 给ssl上下文设置alpn回调3.2 连接初始化3.3 处理alpn协议回调3.4 握手完成,启用http协议4.4 总结阅读姊妹篇:深入理解nginx的https alpn机制 1. 概述 应用层协议协商(…

LabVIEW非接触式电阻抗层析成像系统

LabVIEW非接触式电阻抗层析成像系统 非接触式电阻抗层析成像&#xff08;NEIT&#xff09;技术以其无辐射、非接触、响应速度快的特点&#xff0c;为实时监测提供了新的解决方案。基于LabVIEW的电阻抗层析成像系统&#xff0c;实现了数据的在线采集及实时成像&#xff0c;提高…

javaweb学习(day05-TomCat)

一、介绍 1 官方文档 地址: https://tomcat.apache.org/tomcat-8.0-doc/ 2 WEB 开发介绍 2.1 WEB 在英语中 web 表示网/网络资源(页面,图片,css,js)意思&#xff0c;它用于表示 WEB 服务器(主机)供浏览器访问的资源 2.2 Web 资源 WEB 服务器 ( 主机 ) 上供外界访问的 …

CAPL编程学习笔记--关于on 事件的详细解释

CAPL编程是比较有特色的一种面向通讯的编程语言。 1&#xff1a;on XXX类型&#xff08;即事件类型&#xff09; 维克多的官方文档对CAPL的描述是一门类C语言&#xff0c;说白了它也是用C写出来的。我们看on&#xff08;注意都是小写&#xff09;事件的代码结构 on * { }&…

Docker技术概论(2):Docker环境的搭建

Docker技术概论&#xff08;2&#xff09; Docker环境的搭建 - 文章信息 - Author: 李俊才 (jcLee95) Visit me at: https://jclee95.blog.csdn.netMy WebSite&#xff1a;http://thispage.tech/Email: 291148484163.com. Shenzhen ChinaAddress of this article:https://blo…

【Javascript编程实操03】1、根据数字显示对应的星期2、输入月份,显示当月的天数

前言 1、根据数字显示对应的星期 代码&#xff1a; 实现效果&#xff1a; 2、输入月份&#xff0c;显示当月的天数 原理&#xff1a; 代码&#xff1a; 实现效果&#xff1a; 总结 前言 本次主要是针对Javascript阶段的switch的实操练习&#xff0c;共有2个实操。 1、…

BioTech - 大分子药物设计 概述

欢迎关注我的CSDN&#xff1a;https://spike.blog.csdn.net/ 本文地址&#xff1a;https://spike.blog.csdn.net/article/details/136302202 大分子药物设计领域主要包括3个方面&#xff0c;即大环类药物设计、蛋白质与多肽类药物设计、核酸药物设计等&#xff0c;具体如下&…

磁盘分区配置开机自动挂载

客户提供的服务器 有1TB的磁盘需要手动挂载 首先查看一下磁盘设备 lsblk 可以看到vdb是新添加的磁盘 然后使用fdisk /dev/vdb 进行磁盘分区 新添加的磁盘只需要分一个区默认全部回车即可 然后使用lsblk查看一下磁盘设备 做好磁盘分区后需要做文件系统格式化 mkfs.ext4 /dev/vd…

SINAMICS V90 PN 指导手册 第5章 调试说明、调试 Jog、EPOS、速度调试

前几章介绍了V90 PN 系统的产品功能、技术数据、安装以及连接&#xff0c;从本章开始&#xff0c;重点介绍V90 PN的应用指导&#xff0c;本章介绍的主要内容是调试&#xff0c;包括调试说明、Jog模式下调试、基本定位器模式下(EPOS)调试以及速度模式(S)下调试。 调试说明 悬挂…

Window部署Jaeger

参考&#xff1a;windows安装使用jaeger链路追踪_windows安装jaeger-CSDN博客 下载&#xff1a;Releases jaegertracing/jaeger GitHub Jaeger – Download Jaeger 目录 1、安装nssm 2、安装运行 elasticsearch 3、安装运行 3.1部署JaegerAgent 3.2部署JaegerCollec…

Opencv实战(5)平滑处理与常见函数

平滑处理 Opencv实战&#xff1a; Opencv(1)读取与图像操作 Opencv(2)绘图与图像操作 Opencv(3)详解霍夫变换 Opencv(4)详解轮廓 文章目录 平滑处理1.均值滤波2.方框滤波3.高斯滤波4.中值滤波5.双边滤波 常见函数(1).createTrackbar()(2).SetMouseCallback() 图像的平滑处理是…

备战蓝桥杯---线段树基础1

引入&#xff1a;RMQ问题&#xff1a; 什么是RMQ&#xff1f; 显然&#xff0c;我们无法用前缀维护&#xff0c;因此&#xff0c;我们需要用到线段树的知识&#xff1a; 什么是线段树&#xff1f; 线段树是用一种树状结构存储一个连续区间信息的数据结构 下面我们用图解释用…

ARM简介

ARM&#xff1a;ARM是Advanced RISC Machine的缩写&#xff0c;意为高级精简指令集计算机。 英国ARM公司&#xff0c;2016年被软银创始人孙正义斥资320亿美元收购了。现在是软银旗下的芯片设计公司&#xff0c;总部位于英国剑桥&#xff0c;专注于设计芯片&#xff0c;卖芯片生…

两台电脑异地怎么共享文件?

在现代社会中&#xff0c;无论是个人用户还是企事业单位&#xff0c;都经常面临着跨地域的文件共享需求。由于各种限制和条件的限制&#xff0c;如网络环境、设备限制等&#xff0c;可能导致文件共享变得非常困难。本文将介绍一款名为【天联】的组网产品&#xff0c;通过它可以…

非阻塞实现高效键盘扫描功能(STM32F4XX)

目录 概述 1 原理分析 1.1 技术背景 1.2 系统硬件 1.3 STM32 IO&#xff08;输入模式&#xff09;寄存器分析 1.3.1 输入IO的功能描述 1.3.2 输入配置 1.3.3 GPIO 寄存器&#xff08;输入模式相关&#xff09; 1.3.3.1 GPIO 端口模式寄存器 1.3.3.2 GPIO 端口上拉/下拉…