精通Maven的捷径:一文包揽所有必知必学

news2024/11/19 23:24:01

Maven是每个Java程序都会遇到的包管理工具,今天整理一下Maven的相关知识,从青铜到王者,一文全了解,我们开始吧!

1、maven是什么,为什么存在?项目结构是什么样子,怎么定位jar

官方网站说了好多,整得多复杂一样,简单说:maven是一个管理包的工具。

Maven 存在的必要性是什么呐?想想开源的jar包如此之多,版本又如此之多,在没有Maven之前,我们管理jar包全部都是下载之后创建一个lib的文件夹,然后项目进行引用,在其他的项目成员需要修改一个jar的时候需要到处拷贝,在部署的时候也很麻烦,问题存在就要解决,因此出现了Maven,统一管理,统一的仓库,只需要配置是要哪个版本的包,直接下载就够了,不用拷贝,是不是很方便。

现在大的问题解决了,怎么定位一个jar包呐?

e965501434c752830e0744314044aaed.jpeg

2、Idea 的操作

1.新建maven项目

File ->新建->project

405aa04eee2fd7d5894a9dafcd2ade8e.jpeg

勾选从原型(模板)创建,选择maven-archetype-qiuckstart

943741b7389ca6fbcb211ff839071d81.jpeg

填入项目的名字,和groupId (公司域名反过来,如com.alibaba)

6f9ddf4ab9016241cbab770d810eb7c2.jpeg

选择本地仓库的位置,和自定义的setting配置

e5f2da6455cccdfd717d4b015f904798.jpeg

一路finish,然后等待idea 创建模板项目就好了。

2.配置仓库

Maven 仓库有三种类型:

  • 本地(local)
  • 中央(central)
  • 远程(remote)

当我们执行 Maven 构建命令时,Maven 开始按照以下顺序查找依赖的库:

  • 步骤 1 - 在本地仓库中搜索,如果找不到,执行步骤 2,如果找到了则执行其他操作。
  • 步骤 2 - 在中央仓库中搜索,如果找不到,并且有一个或多个远程仓库已经设置,则执行步骤 4,如果找到了则下载到本地仓库中以备将来引用。
  • 步骤 3 - 如果远程仓库没有被设置,Maven 将简单的停滞处理并抛出错误(无法找到依赖的文件)。
  • 步骤 4 - 在一个或多个远程仓库中搜索依赖的文件,如果找到则下载到本地仓库以备将来引用,否则 Maven 将停止处理并抛出错误(无法找到依赖的文件)。

阿里云仓库配置:

&nbsp;<repositories>&nbsp; &nbsp; &nbsp; &nbsp;<repository>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<id>central</id>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<name>aliyun maven</name>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<url>https://maven.aliyun.com/repository/public/</url>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<layout>default</layout>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<!-- 是否开启发布版构件下载 -->&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<releases>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<enabled>true</enabled>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;</releases>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<!-- 是否开启快照版构件下载 -->&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<snapshots>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<enabled>false</enabled>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;</snapshots>&nbsp; &nbsp; &nbsp; &nbsp;</repository>&nbsp; &nbsp;</repositories>

3.添加依赖,添加fastjson的依赖

举个例子:

&nbsp;<dependency>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<groupId>com.alibaba</groupId>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<artifactId>fastjson</artifactId>&nbsp; &nbsp; &nbsp; &nbsp;</dependency>

4.打包项目

44f7ebcad864a1a2d0c140d2a209b169.jpeg

4、Maven坐标主要组成

groupId:组织标识(包名),一般常用公司域名的反序,比如com.alibaba

artifactId:项目名称,项目的具体名称

version:项目的当前版本 ,一般版本号为 大版本.小版本.小版本序号

packaging:项目的打包方式,最为常见的jar和war两种

5、maven生命周期

5.1 名词解释

lifecycle:生命周期,这是maven最高级别的的控制单元,它是一系列的phase组成,也就是说,一个生命周期,就是一个大任务的总称,不管它里面分成多少个子任务,反正就是运行一个lifecycle,就是交待了一个任务,运行完后,就得到了一个结果,中间的过程,是phase完成的,自己可以定义自己的lifecycle,包含自己想要的phase

phase:可以理解为任务单元,lifecycle是总任务,phase就是总任务分出来的一个个子任务,但是这些子任务是被规格化的,它可以同时被多个lifecycle所包含,一个lifecycle可以包含任意个phase,phase的执行是按顺序的,一个phase可以绑定很多个goal,至少为一个,没有goal的phase是没有意义的

goal: 这是执行任务的最小单元,它可以绑定到任意个phase中,一个phase有一个或多个goal,goal也是按顺序执行的,一个phase被执行时,绑定到phase里的goal会按绑定的时间被顺序执行,不管phase已经绑定了多少个goal,你自己定义的goal都可以继续绑到phase中

mojo: lifecycle与phase与goal都是概念上的东西,mojo才是做具体事情的,可以简单理解mojo为goal的实现类,它继承于AbstractMojo,有一个execute方法,goal等的定义都是通过在mojo里定义一些注释的anotation来实现的,maven会在打包时,自动根据这些anotation生成一些xml文件,放在plugin的jar包里

可以通俗理解为lifecyle 是一个公司,phrase 是具体的部门,goal 是一个项目,Mojo 是项目内部的人,其他的都是管理层级,具体的执行还是人。

5.2 生命周期

ffa1c26ab876d481bfc0703b49c365d0.jpeg

5.3 goal 的概念

一个goal是独立的,它可以被绑定到多个phase中去,也可以一个phase都没有。如果一个goal没有被绑定到任何一个lifecycle,它仍然可以直接被调用,而不是被lifecycle调用。

因此可以这样理解phase与goal的关系:

  1. phase其实就是goal的容器。实际被执行的都是goal。phase被执行时,实际执行的都是被绑定到该phase的goal。
  2. goal与goal之间是独立的。因此单独执行一个goal不会导致其他goal被执行。

goal可以通俗理解为一个项目。

5.4 生命周期和phase的关系

 clean生命周期每套生命周期都由一组阶段(Phase)组成,我们平时在命令行输入的命令总会对应于一个特定的阶段。比如,运行mvn clean ,这个的clean是Clean生命周期的一个阶段。有Clean生命周期,也有clean阶段。Clean生命周期一共包含了三个阶段:

  1. pre-clean 执行一些需要在clean之前完成的工作
  2. clean 移除所有上一次构建生成的文件
  3. post-clean 执行一些需要在clean之后立刻完成的工作

  "mvn clean" 中的clean就是上面的clean,在一个生命周期中,运行某个阶段的时候,它之前的所有阶段都会被运行,也就是说,"mvn clean"等同于 mvn pre-clean clean ,如果我们运行 mvn post-clean ,那么 pre-clean,clean 都会被运行。这是Maven很重要的一个规则,可以大大简化命令行的输入

执行phase实际执行的是goal。如果一个phase没有绑定goal,那这个phase就不会被执行。

<plugin>&nbsp;&nbsp;<groupId>com.mycompany.example</groupId>&nbsp;&nbsp;<artifactId>display-maven-plugin</artifactId>&nbsp;&nbsp;<version>1.0</version>&nbsp;&nbsp;<executions>&nbsp; &nbsp;&nbsp;<execution>&nbsp; &nbsp; &nbsp;&nbsp;<phase>process-test-resources</phase>&nbsp; &nbsp; &nbsp;&nbsp;<goals>&nbsp; &nbsp; &nbsp; &nbsp;&nbsp;<goal>time</goal>&nbsp; &nbsp; &nbsp;&nbsp;</goals>&nbsp; &nbsp;&nbsp;</execution>&nbsp;&nbsp;</executions></plugin>

一个生命周期包含一些列的步骤,当执行生命周期的时候,会把所有的步骤执行一次

官方文档:

http://maven.apache.org/guides/introduction/introduction-to-the-lifecycle.html

http://maven.apache.org/ref/3.3.9/maven-core/lifecycles.html

6、idea maven的配置

POM 中可以指定以下配置:

  • 项目依赖 dependencies
  • 插件 plugins
  • 执行目标
  • 项目构建 profile
  • 项目版本
  • 项目开发者列表
  • 相关邮件列表信息
  • 具体的配置可以参考fastjson 的配置:

https://github.com/alibaba/fastjson/blob/master/pom.xml

7、POM有2个很重要的关系:聚合、继承

一、聚合

  如果我们想一次构建多个项目模块,那我们就需要对多个项目模块进行聚合

1.聚合配置代码

<modules>&nbsp; &nbsp; &nbsp;&nbsp;<module>模块一</module>&nbsp; &nbsp; &nbsp;&nbsp;<module>模块二</module>&nbsp; &nbsp; &nbsp;&nbsp;<module>模块三</module></modules>

例如:对项目的Hello、HelloFriend、MakeFriends这三个模块进行聚合

<modules>&nbsp; &nbsp; &nbsp;&nbsp;<module>../Hello</module>&nbsp;&nbsp;&nbsp; &nbsp; &nbsp;&nbsp;<module>../HelloFriend</module>&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;&nbsp; &nbsp; &nbsp;&nbsp;<module>../MakeFriends</module></modules>

 其中module的路径为相对路径。

二、继承

  继承为了消除重复的配置,我们把很多相同的配置提取出来,例如:grouptId,version,相同的依赖包等。

继承配置代码:

<parent>&nbsp;&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<groupId>me.gacl.maven</groupId>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<artifactId>ParentProject</artifactId>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<version>0.0.1-SNAPSHOT</version>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<relativePath>../ParentProject/pom.xml</relativePath>&nbsp;&nbsp;</parent>

Idea 中可以新建一个maven项目,然后删光文件夹,只留一个pom.xml,然后添加模块,选择继承。

1c0181facc822e5312d4bf1aa53142c3.jpeg

8、Maven 中的 profile

Maven 中有一个概念叫做:profile,它主要是为了解决不同环境所需的不同变量、配置等问题。比如我们内网开发的数据库配置,端口配置等是和生产环境不同的,这个时候就需要区分。

有了 profile,可以根据激活的条件,启动不同条件下的配置信息。

profile 是可以有多个的,也可以同时激活多个 profile,方便自由组合。

<profiles>&nbsp; &nbsp; &nbsp; &nbsp;<profile>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<!--不同环境Profile的唯一id-->&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<!--开发环境-->&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<id>dev</id>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<properties>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<!--profiles.active是自定义的字段(名字随便起),自定义字段可以有多个-->&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<profiles.active>dev</profiles.active>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;</properties>&nbsp; &nbsp; &nbsp; &nbsp;</profile>&nbsp; &nbsp; &nbsp; &nbsp;<profile>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<!--线上环境-->&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<id>prod</id>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<properties>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<profiles.active>prod</profiles.active>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;</properties>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<activation>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<activeByDefault>true</activeByDefault>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;</activation>&nbsp; &nbsp; &nbsp; &nbsp;</profile>&nbsp; &nbsp;</profiles> c7ff93788a7b9ef48839cabd5af38ed5.jpeg

Idea 中会显示配置的两个profile ,可以选择激活

bd5adab3779605250231fdf0ac486023.jpeg

pom文件里的配置为

<build>&nbsp; &nbsp; &nbsp; &nbsp;<resources>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<resource>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<directory>src/main/resources/</directory>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<!--先排除掉两个文件夹-->&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<excludes>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<exclude>dev/*</exclude>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<exclude>prod/*</exclude>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;</excludes>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<includes>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<!--如果有其他定义通用文件,需要包含进来-->&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<!--<include>messages/*</include>-->&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;</includes>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;</resource>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<resource>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<!--这里是关键!根据不同的环境,把对应文件夹里的配置文件打包-->&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<directory>src/main/resources/${profiles.active}</directory>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;</resource>&nbsp; &nbsp; &nbsp; &nbsp;</resources>&nbsp; &nbsp;</build> &nbsp;&nbsp;<profiles>&nbsp; &nbsp; &nbsp; &nbsp;<profile>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<!--不同环境Profile的唯一id-->&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<!--开发环境-->&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<id>dev</id>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<properties>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<!--profiles.active是自定义的字段(名字随便起),自定义字段可以有多个-->&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<profiles.active>dev</profiles.active>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;</properties>&nbsp; &nbsp; &nbsp; &nbsp;</profile>&nbsp; &nbsp; &nbsp; &nbsp;<profile>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<!--线上环境-->&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<id>prod</id>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<properties>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<profiles.active>prod</profiles.active>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;</properties>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<activation>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<activeByDefault>true</activeByDefault>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;</activation>&nbsp; &nbsp; &nbsp; &nbsp;</profile>&nbsp; &nbsp;</profiles>

9、maven 插件

Maven的核心仅仅定义了抽象的生命周期,具体的任务都是交由插件完成的。

每个插件都能实现多个功能,每个功能就是一个插件目标goal。

Maven的生命周期与插件目标相互绑定,以完成某个具体的构建任务,例如compile就是插件maven-compiler-plugin的一个插件目标。

常用插件:

maven-antrun-plugin maven-archetype-plugin maven-assembly-plugin maven-dependency-plugin maven-enforcer-plugin maven-help-plugin maven-release-plugin maven-resources-plugin maven-surefire-plugin build-helper-maven-plugin exec-maven-plugin jetty-maven-plugin versions-maven-plugin

10、环境变量

${basedir}表示项目根目录,即包含pom.xml文件的目录;

${version}表示项目版本;

${project.basedir}同${basedir};

${project.baseUri}表示项目文件地址;

${maven.build.timestamp}表示项目构件开始时间;

${maven.build.timestamp.format}表示属性${maven.build.timestamp}的展示格式,默认值为yyyyMMdd-HHmm,可自定义其格式,其类型可参考java.text.SimpleDateFormat。

${project.build.directory}表示主源码路径;

${project.build.sourceEncoding}表示主源码的编码格式;

${project.build.sourceDirectory}表示主源码路径;

${project.build.finalName}表示输出文件名称;

${project.version}表示项目版本,与${version}相同;

${project.xxx} 当前pom文件的任意节点的内容

${env.xxx} 获取系统环境变量。

${settings.xxx} 指代了settings.xml中对应元素的值。


11、Maven 依赖冲突的2个方法

1.统一版本

使用dependencyManagement 进行版本锁定,dependencyManagement可以统一管理项目的版本号,确保应用的各个项目的依赖和版本一致。

如果我们项目中只想使用spring core 5.2.0的包,pom.xml可以改为如下

<dependencyManagement>&nbsp; &nbsp; &nbsp; &nbsp;<dependencies>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<dependency>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<groupId>org.springframework</groupId>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<artifactId>spring-core</artifactId>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<version>5.2.0.RELEASE</version>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;</dependency>&nbsp; &nbsp; &nbsp; &nbsp;</dependencies>&nbsp; &nbsp;</dependencyManagement> &nbsp; &nbsp;<dependencies>&nbsp; &nbsp; &nbsp; &nbsp;<dependency>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<groupId>org.springframework</groupId>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<artifactId>spring-context</artifactId>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<version>5.2.7.RELEASE</version>&nbsp; &nbsp; &nbsp; &nbsp;</dependency> &nbsp; &nbsp; &nbsp; &nbsp;<dependency>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<groupId>org.springframework</groupId>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<artifactId>spring-aop</artifactId>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<version>5.2.0.RELEASE</version>&nbsp; &nbsp; &nbsp; &nbsp;</dependency> &nbsp; &nbsp;</dependencies>

2.排除依赖

依赖查找的两个原则:

使用路径近者优先原则:直接依赖级别高于传递依赖。

使用第一声明者优先原则:谁先定义的就用谁的传递依赖,即在pom.xml文件自上而下,先声明的jar坐标,就先引用该jar的传递依赖。

Idea 可以安装maven helper插件,解决冲突。

maven helper插件安装成功,点开pom.xml会发现多了一个Dependency Analyzer视图,如下上面按钮的图标含义如下

Conflicts(查看冲突)

All Dependencies as List(列表形式查看所有依赖)

All Dependencies as Tree(树形式查看所有依赖)

上图说明有3个jar存在冲突,点击冲突的jar,可以查看和哪个jar产生冲突,如下图

9a2f3e842bc370c47cdbf85b0c13bc8f.jpeg

点开pom.xml,切换到Dependency Analyzer视图,选择All Dependencies as Tree,点击要排除的jar,右键会出现Execlude选项,如下

60b0e0703b1fc98896822b31e71f3c6c.jpeg

总结:

Maven是开发中常用的工具,很重要,所以尽可能地掌握。

你还知道Maven的哪些知识,欢迎留言交流!!!

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

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

相关文章

【ROS】ros-noetic和anaconda联合使用【教程】

【ROS】ros-noetic和anaconda联合使用【教程】 文章目录 【ROS】ros-noetic和anaconda联合使用【教程】1. 安装anaconda2. 创建虚拟环境3. 查看python解释器路径4. 在虚拟环境中使用任意的包5. 创建工作空间和ros功能包进行测试Reference 1. 安装anaconda 在Ubuntu20.04中安装…

统一观测丨使用 Prometheus 监控 SQL Server 最佳实践

作者&#xff1a;啃唯 SQL Server 简介 SQL Server 是什么&#xff1f; Microsoft SQL Server 是 Microsoft 推出的关系型数据库解决方案&#xff0c;支持企业 IT 环境中的各种事务处理、商业智能和分析应用程序。Microsoft SQL Server 是市场领先的数据库技术之一。 SQL S…

【算法-动态规划】最长上升子序列-力扣 300

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kuan 的首页,持续学…

无限连接:前端跨页面通信的实现与应用

&#x1f3ac; 江城开朗的豌豆&#xff1a;个人主页 &#x1f525; 个人专栏 :《 VUE 》 《 javaScript 》 &#x1f4dd; 个人网站 :《 江城开朗的豌豆&#x1fadb; 》 ⛺️ 生活的理想&#xff0c;就是为了理想的生活 ! 目录 引言 1. 前端跨页面通信的概述 2. 前端跨页…

RunnerGo测试平台,无代码玩转UI自动化测试

首先需要进入官网&#xff0c;RunnerGo支持开源&#xff0c;可以自行下载安装&#xff0c;也可以点击右上角体验企业版按钮快速体验 点击体验企业版进入工作台后可以点击页面上方的UI自动化 进入到测试页面 创建元素 我们可以在元素管理中创建我们测试时需要的元素 这里我们以…

PPT制作软件哪个好?各种类型的10款好用PPT软件盘点!

想必大家对PPT并不陌生&#xff0c;它在日常的工作或学习中有诸多应用场景&#xff0c;小到制作一份电子相册&#xff0c;大到一场产品发布会&#xff0c;都可以看到PPT的影子。 如果我们细究PPT的话&#xff0c;会发现可以细分出各种类型的PPT软件&#xff0c;诸如&#xff1…

Linux指令集合

磁盘相关命令 df//查看磁盘整体状况df -h //查看磁盘整体状况du //查看磁盘使用情况&#xff0c;如果不加目录&#xff0c;默认为当前目录du -h -d 0//表示我们只希望看当前目录磁盘使用情况&#xff0c;不会继续展示这层目录的下一级目录 du -h -d 1//表示展示当前目录的下一…

微信自动批量添加好友的方法

在现在的营销中微信已成为一种重要的沟通方式。微信目前是没有自动批量添加好友的功能&#xff0c;需要运营者一个一个手动去添加&#xff0c;这样太过于浪费时间&#xff0c;并且加频繁了还容易被封号&#xff0c;今天给大家介绍几种手动批量加好友的方式以及怎么借助第三方软…

深入理解AQS之ReentrantLock源码分析

开题&#xff1a;如何自己生成一把独占锁&#xff1f; 1. 管程 — Java同步的设计思想 管程&#xff1a;指的是管理共享变量以及对共享变量的操作过程&#xff0c;让他们支持并发。 互斥&#xff1a;同一时刻只允许一个线程访问共享资源&#xff1b; 同步&#xff1a;线程之间…

【测试】丝滑版本测试记录2023-10-13

目录 四组24个视频拉取 视频拉取的带宽 本地内存不足 四组24个视频拉取 视频拉取的带宽 本地内存不足 由于 edge需要内存大几百M,加截wasm要更多一点&#xff0c;只剩下 400M,不足以使用

git+gitee代码上传

gitgitee代码上传 1、git应用工具下载安装 gitee应用注册并创建仓库点创建后进入到仓库 git命令关于.gitignore只执行一次的命令经常执行的命令 1、git应用工具 下载安装 https://git-scm.com/downloads $ git --version git version 2.39.0.windows.2代码仓库&#xff1a; …

全力以赴,火山引擎边缘云代表团出战亚运会

END 未来&#xff0c;火山引擎边缘云赛事阵容将继续全力以赴&#xff0c;通过领先、可信赖的云和智能技术&#xff0c;助力游戏行业呈现更加精彩的竞技赛事。

LeetCode【240】搜索二维矩阵

题目&#xff1a; 思路&#xff1a; 1、单靠对角线元素无法判定位置 2、主要逐行进行二分 代码&#xff1a; public boolean searchMatrix(int[][] matrix, int target) {int rows matrix.length;int columns matrix[0].length;// 按行进行二分for (int i 0; i < rows…

Apipost连接数据库详解

Apipost提供了数据库连接功能&#xff0c;在接口调试时可以使用数据库获取入参或进行断言校验。目前的Apipost支持&#xff1a;Mysql、SQL Sever、Oracle、Clickhouse、达梦数据库、PostgreSQL、Redis、MongoDB 8种数据库的连接操作 新建数据库连接&#xff1a; 在「项目设置…

ue5蓝图请求接口

安装与使用 1、在虚幻商城搜索 VaRest 插件 2、选择自己项目的对应版本安装 3、查看是否安装成功 4、进入项目后,分别启动VaRest、JSON Blueprint Utilities两个插件(勾选后会提示重启项目) 5、基本用法:打开关卡蓝图使用(url改为自己的接口、Verb是请求方式) 5.1、或者…

了解什么是JWT

目录 JWT 是什么 有什么用 Jwt的使用 依赖 工具类 过滤器 控制器 配置 测试类 案列 JWT 是什么 JWT是指JSON Web Token&#xff0c;它是一种用于在网络应用间安全传递信息的开放标准&#xff08;RFC 7519&#xff09;。JWT通过使用私钥对JSON数据进行签名或者使用公钥…

蜘蛛飞机大战

欢迎来到程序小院 蜘蛛飞机大战 玩法&#xff1a; 点击开始游戏&#xff0c;鼠标移动控制方向&#xff0c;可自由移动飞机打剁掉方飞机下落的子弹并打掉敌方飞机&#xff0c;三次生命&#xff0c;不同关卡不同奖励&#xff0c;快去闯关吧^^。开始游戏https://www.ormcc.com/pl…

高数笔记03:几何、物理应用

图源&#xff1a;文心一言 本文是我学习高等数学几何、物理应用的一些笔记和心得&#xff0c;希望可以与考研路上的小伙伴一起努力上岸~~&#x1f95d;&#x1f95d; 第1版&#xff1a;查资料、画导图~&#x1f9e9;&#x1f9e9; 参考资料&#xff1a;《高等数学 基础篇》武…

计算机操作系统-第五天

目录 1、系统调用 什么是系统调用&#xff1f;有何作用&#xff1f; 系统调用与库函数的区别&#xff1a; 为什么系统调用是必须的&#xff1f; 什么功能要用到系统调用&#xff1f; 系统调用的过程&#xff1a; 1、系统调用 什么是系统调用&#xff1f;有何作用&#…

如何通过 NFTScan API 按照 NFT 合约地址检索数据?

在当前 NFT 市场还在不断扩张的背景下&#xff0c;各种 NFT 项目依旧是井喷式涌现&#xff0c;投资者和开发者都面临获取项目全貌数据的困境。公链上提取和处理大量的数据既费时又费力&#xff0c;缺乏全面的信息支持&#xff0c;将难以深入判断一个 NFT 项目的真实情况&#x…