【Maven】依赖管理
4. Maven的依赖管理
在 Java 开发中,项目的依赖管理是一项重要任务。通过合理管理项目的依赖关系,我们可以有效的管理第三方库,模块的引用及版本控制。而 Maven 作为一个强大的构建工具和依赖管理工具,为我们提供了便捷的方式来管理项目的依赖。
4.1 什么是依赖范围
- Maven 的依赖构件包含一个依赖范围的属性。
- 这个属性描述的是三套 classpath 的控制,即编译、测试、运行,也就是添加的 jar 包起作用的范围。
- Maven 提供了以下几种依赖范围:compile、test、provided、runtime、system。
- 在 pom.xml 文件中使用 标签指定依赖范围类型。
1、compile
编译依赖范围。
依赖范围对于编译、测试、运行 3 种 classpath 都有效。如果没有指定,默认使用该依赖范围。
也就是说,compile 在整个项目下和运行时都有效,Maven 都会帮助导包:
2、test
测试依赖范围。
此依赖范围只对编译测试、运行测试的 classpath 有效,在编译主代码、运行项目时无法使用此类依赖。比如 junit,它只有在编译测试代码、运行测试时才需要。
当依赖范围是 test 时:
- 在 src/test 目录下,Maven 会帮忙导入这些包。
- 出了此范围,Maven 不会导包。
示例:
在 maven_01_javase 模块中,我们在 pom.xml 中引入 junit 依赖,并指定依赖范围为 test:
这时候,我们可以在 src/test 包下的测试类 MathCalculateTest 中导入 junit 包:
然后,把 MathCalculateTest 类复制粘贴到 src/main 包下,发现无法将 junit 包导入到类中。这是因为,junit 的依赖范围是 test,它只能在 src/test 包下引入。
3、provided
已提供依赖范围。
此依赖范围对于编译源码、编译测试、运行测试中 classpath 有效,但在运行时无效,因为项目的运行环境中已经提供了所需要的构件。比如上面说到的 servlet-api,这个在编译和测试的时候需要用到,但是在运行的时候,Web 容器已经提供了,就不需要 Maven 帮忙引入了。Tomcat 服务器就提供了 servlet-api:
示例:
1、在 maven_03_javawebnew 模块中,我们在 pom.xml 文件中,引入了 servlet、junit、和 MyBatis,并分别指定依赖范围为 provided、test 和 compile。
2、然后,我们将 maven_03_javawebnew 模块打包,以观察 war 包中的 jar 包引入情况。
3、打包后,得到了模块的 war 包:
4、将 war 包后缀修改为 rar 压缩包格式,并打开,发现只有一个 MyBatis 的 jar 包:
因此,在打包时,compile 依赖范围的 jar 包 Maven 会帮忙引入;而 test 和 provided 依赖范围的 jar 包 Maven 不会引入。
4、runtime
运行时依赖范围。
此依赖范围对于测试和运行项目的 classpath 有效,但在编译时无效,比如 JDBC 驱动实现,项目代码编译的时候只需要使用 JDK 提供的 JDBC 接口,运行的时候才需要具体的 JDBC 驱动实现。
<dependencies><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>5.1.32</version><scope>runtime</scope></dependency>
</dependencies>
5、system
系统依赖范围。
此依赖直接依赖于本地路径。可能每个开发者机器中构件的路径不一致,如果使用这种写法,你的机器中可能没有问题,别人的机器中就会有问题,所以建议谨慎使用。
需要使用 标签显式地指定依赖文件的路径。
总测试:
1、在 maven_03_javawebnew 模块中,引入 5 种类型的依赖:
<dependencies><!--添加 Servlet 的依赖--><dependency><groupId>javax.servlet</groupId><artifactId>javax.servlet-api</artifactId><version>4.0.1</version><scope>provided</scope></dependency><!--添加 junit 的依赖--><dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>4.13.2</version><scope>test</scope></dependency><!--添加 MyBatis 的依赖--><dependency><groupId>org.mybatis</groupId><artifactId>mybatis</artifactId><version>3.5.11</version><scope>compile</scope></dependency><!--添加 MySQL 的依赖--><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>5.1.32</version><scope>runtime</scope></dependency><!--添加 maven_01_javase 的依赖--><dependency><groupId>cn.myphoenix</groupId><artifactId>maven_01_javase</artifactId><version>1.0-SNAPSHOT</version><scope>system</scope><systemPath>C:/Coding_Gallery/Intellij_IDEA_Workspace/learning_maven/maven_01_javase/target/maven_01_javase-1.0-SNAPSHOT.jar</systemPath></dependency></dependencies>
2、将 maven_03_javawebnew 打包,观察 jar 包引入情况:
发现只有 complie 和 runtime 类型的依赖可以导入,其他 3 种类型未导入。
作用范围总结:
依赖范围的再理解:
在项目中引入依赖的同时,我们可以为依赖指定依赖范围。从这个角度来看,依赖范围就是当前项目希望引入的依赖(jar 包)在什么范围内起作用,在什么范围内不起作用。
4.2 什么是依赖传递
依赖具有传递性。
Maven 的依赖传递机制:不管 Maven 项目存在多少间接依赖,POM 中都只需要定义其直接依赖,不必定义任何间接依赖,间接依赖都由 Maven 自动导入,这在一定程度上简化了 POM 的配置。
假项目 A 依赖项目 B,项目 B 依赖项目 C,则 A 直接依赖 B,B 直接依赖 C,而 A 间接依赖 C。
示例:说明间接依赖
现在,maven_01_javase 模块中引入了 junit 1 个依赖。为了演示直接依赖和间接依赖,现在在该模块中引入 spring-context 依赖。
引入依赖后,发现 spring-context 这个一级依赖下又引入了多个间接依赖,这些间接依赖都是由 Maven 自动引入的。
4.2.1 依赖范围对依赖传递的影响
B 是 A 的直接依赖,C 是 A 的间接依赖,根据 Maven 的依赖传递机制,间接依赖 C 会以传递性依赖的形式引入到 A 中,但这种引入并不是无条件的,它会受到依赖范围的影响。
举例说明:本例子依据为下图
1、创建 2 个项目 maven_laoda 和 maven_mazai,在 maven_laoda 引入 maven_mazai,则 maven_mazai 是 maven_laoda 的直接依赖;在 maven_mazai 中引入 MyBatis 依赖,则 MyBatis 是 maven_laoda 的间接依赖。
2、在 maven_mazai 中执行 install,将 maven_mazai 安装到本地仓库(在公司中是安装到私服),然后,在 maven_laoda 中通过 GAV 引入 maven_mazai 依赖。
3、在 maven_laoda 的 pom.xml 中为 maven_mazai 设置不同的依赖范围。同时,在 maven_mazai 的 pom.xml 中为 MyBatis 设置不同的依赖范围。观察:
- 在 maven_laoda 中能否引入间接依赖 MyBatis
- 如果能引入,那么间接依赖 MyBatis 的依赖范围类型是什么
接下来进行测试。固定间接依赖的类型,变动直接依赖的类型。
测试 1:间接依赖为 compile,直接依赖为 compile。
测试结果:间接依赖被引入到 maven_laoda 中;依赖范围是 compile。
测试 2:间接依赖为 compile,直接依赖为 test。
测试结果:间接依赖被引入到 maven_laoda 中;依赖范围是 test。
……
测试 n:间接依赖为 test,直接依赖为 compile。
测试结果:间接依赖没有被引入到 maven_laoda 中。
……
测试 n + m:间接依赖为 provided,直接依赖为 compile。
测试结果:间接依赖没有被引入到 maven_laoda 中。
……
测试 n + k:间接依赖为 runtime,直接依赖为 compile。
测试结果:间接依赖被引入到 maven_laoda 中;依赖范围是 runtime。
总结:
- 当间接依赖的范围是 compile 时,间接依赖在项目中的范围与直接依赖的范围一致;
- 当间接依赖的范围是 test 或 provided时,间接依赖不会被传递;
- 当间接依赖的范围是 runtime 时,间接依赖在项目中的范围与直接依赖的范围一致,但 compile 例外,此时间接依赖在项目中的范围为 runtime。
4.3 依赖冲突
4.3.1 什么是依赖冲突
在 Maven 项目中,依赖通常被定义在项目的 pom.xml 文件中。当引入同一个依赖的多个不同版本时,就会发生依赖冲突。
这可能是因为项目的直接依赖和间接依赖导致了同一库的多个版本存在于类路径中。每个显式声明的类包都会依赖于一些其他的隐式类包,这些隐式的类包会被 Maven 间接引入进来,从而造成类包冲突。
4.3.2 依赖冲突的解决方案
Maven 可以通过以下途径解决依赖冲突。
4.3.2.1 版本锁定
在父工程中使用 标签进行版本锁定。
- dependencyManagement 可以统一管理整个项目的版本号,确保项目的各个模块的依赖版本一致。
- dependencyManagement 只是声明依赖,并不会在项目中引入依赖。
- 子项目需要显式地声明需要用的依赖,可以不指定版本,其与项目声明的版本一致。
- 如果排斥父工程中定义的版本号,可以显式地进行版本号声明。
示例:
1、创建 maven_parent 模块,在该模块下创建子模块 maven_son,观察两个模块的 pom.xml 文件:
- 父模块指定了 GAV;子模块只指定了 A,其 G 和 V 继承自父模块。
- 在父模块中,声明了子模块;在子模块中,声明了父模块。
- 父模块中指明了打包方式是 pom。pom 是父工程的打包方式,此工程不能运行,只是来进行规范和定义的。
2、在 maven_parent 模块的 pom.xml 文件中,使用 dependencyManagement 声明 junit 依赖的版本(红框)。然后,在子模块 maven_son 的 pom.xml 文件中引入 junit 依赖,不需要指明版本,使用父模块中声明的版本(橙色框)。
另外,可以看到父模块并没有引入 junit 依赖(绿框)。
3、(可选)可以在子模块中指定 junit 的版本,而不使用父模块中声明的版本。但这样做的意义不大,因为使用 dependencyManagement 就是要做版本锁定的。
4、(继承)可以不使用 dependencyManagement,而是直接在父模块中使用 dependency 引入依赖。这样的话,子模块不需要显式地引入依赖,因为它会继承父模块的所有依赖。
dependencyManagement 的版本锁定可以在子模块中按需引入依赖,而继承****会使子模块拥有父模块的所有依赖,使子模块依赖变得臃肿。
4.3.2.2 短路径优先
路径短者优先引入。顾名思义,当一个间接依赖存在多条引入路径时,引入路径短的会被解析使用。如下图所示,maven_02 会引入 junit 的 4.12 版本而不是 4.13 版本。
示例:
1、创建模块 maven_02 和 maven_03。
2、在 maven_02 中引入 junit 4.12 版本。
3、执行 install,将 maven_03 安装到本地仓库,在 maven_02 中引入 maven_03。
3、在 maven_03 中引入 junit 4.13 版本。
结果如下,在 maven_02 中引入直接依赖 junit 4.12,而丢弃间接依赖 junit 4.13:
4.3.2.3 声明优先
如果存在短路径,则优先选择短路径。如果路径相同,则先声明者优先,POM 文件中依赖声明的顺序决定了间接依赖会不会被解析使用,顺序靠前的优先使用。如下图所示:
示例:
1、创建模块 maven_01、maven_04 和 maven_05。
2、在 maven_04 中引入 junit 4.13 版本;在 maven_05 中引入 junit 4.12 版本。
3、执行 install,将 maven_04 和 maven_05 安装到本地仓库,在 maven_01 中引入 maven_04 和 maven_05。
结果如下:
- 如果 maven_04 的 GAV 在前,则 maven_01 中引入间接依赖 junit 4.13,而丢弃间接依赖 junit 4.12;
- 如果 maven_05 的 GAV 在前,则 maven_01 中引入间接依赖 junit 4.12,而丢弃间接依赖 junit 4.13。
4.3.2.4 特殊优先(后来者居上)
在同一个 pom.xml 文件中,对同一个 jar 包进行了多次不同版本的配置,后面的版本覆盖前面的版本。这种情况比较少见。
示例:
1、创建模块 maven_06。
2、在 maven_06 的 pom.xml 文件中依次引入 junit 4.13、4.8.2 和 4.12 版本。
结果如下,在 maven_06 中引入直接依赖 junit 4.12,而覆盖了 junit 4.8.2 和 junit 4.13:
4.3.2.5 可选依赖
使用 标签禁止传递间接依赖。
如果当前项目被依赖到其它项目中,当前项目可以拒绝交出间接依赖项。如下图所示,maven_07 添加了 maven_08 的依赖,maven_08 可以自主设置其依赖项 junit 4.13 是否被间接传递。true 为不传递间接依赖,那么在 maven_07 项目中就没有 junit 4.13 的依赖。默认是 false,传递间接依赖。
示例:
1、创建模块 maven_07 和 maven_08。
2、在 maven_08 的 pom.xml 文件中引入 junit 4.13 版本。
3、执行 install,将 maven_08 安装到本地仓库,在 maven_07 中引入 maven_08。
结果如下,在 maven_07 中引入了直接依赖 maven_08,但没有引入间接依赖 junit 4.13:
4.3.2.6 排除依赖
当前项目主动排除其依赖项目的间接依赖。也就是控制当前项目是否使用其直接依赖传递下来的接间依赖。如下图所示,在 maven_09 项目中添加 maven_10 项目的依赖,但不要 maven_10 项目中的 junit 4.13 依赖,可以使用排除依赖,这样可以保证当前项目依赖的纯净性。
排除依赖使用 exclusions 元素排除依赖:
- exclusions 元素下可以包含若干个 exclusion 子元素,用于排除若干个间接依赖,该元素包含两个子元素:groupId 和 artifactId,用来确定需要排除的间接依赖的坐标信息。
- exclusion 元素中只需要设置 groupId 和 artifactId 就可以确定需要排除的依赖,无需指定版本 version,也无法指定版本 version
示例:
1、创建模块 maven_09 和 maven_10。
2、在 maven_10 的 pom.xml 文件中引入 junit 4.13 版本。
3、执行 install,将 maven_10 安装到本地仓库,在 maven_09 中引入 maven_10。
结果如下,在 maven_09 中引入了直接依赖 maven_10,但没有引入间接依赖 junit 4.13:
附:可选依赖和排除依赖的区别
排除依赖和可选依赖都能在项目中将间接依赖排除在外,但两者实现机制却完全不一样。
- 可选依赖是自己决定是否向外提供间接依赖。
- 排除依赖是主动拒绝添加直接依赖关联的间接依赖。
- 可选依赖的优先级高于排除依赖
- 若对于同一个间接依赖同时使用排除依赖和可选依赖,那么可选依赖的取值必须为 false,否则排除依赖无法生效。
4.4 Intellij IDEA刷新依赖的8种方式
在 IDEA 中有时候会出现刷新延时的情况,那么需要进行手工刷新依赖。
- 点击 M 刷新按钮。
- 点 Maven 窗口的 Reload All Maven Projects。
- Build —> ReBuild Project 重新构建项目的同时刷新所有依赖。
- 点击本项目的 pom.xml 文件 —> 右键 —> Maven —> Reload Project 刷新本项目的依赖。
- 打开 pom.xml 文件,全选、拷贝、删除、关闭、打开、粘贴,物理刷新 pom.xml 文件 。
- Invalidate Caches —> 全选 —> Invalidate and Restart 清空 IDEA 的缓存并重启 IDEA 刷新依赖。
- 打开本地仓库,搜索 last,全选删除,点 Maven 的刷新全部依赖的按钮。
- 在 7 的步骤后执行 File —> settings —> Build,Execution,Deployment —> Build Tools —> Maven —> Repositories —> 选中本地仓库 —> update —> OK。
4.5 资源文件的指定
问题:
- src/main/java 和 src/test/java 这两个目录中的所有 *.java 文件会分别在 comile 和 test-comiple 阶段被编译,编译结果分别放到了 target/classes 和 targe/test-classes 目录中。但是这两个目录中的其他文件(后缀是 .properties 或 .xml 等文件)都会被忽略掉(编译后丢失)。
- 简单来说就是在 resources 目录下的 *.properties 文件和 *.xml 文件编译时不丢失,但 resources 目录外的 *.properties 文件和 *.xml 文件会丢失。
解决方案:
- 如果需要把 src 目录下的除 .java 之外的文件包放到 target/classes 目录,作为输出的 jar 一部分。需要指定资源文件位置,将内容放到 标签中。
演示一:不指定配置文件的路径,在编译时会丢失
1、新建 maven_11 模块。
2、在 src/main/java/cn/myphoenix 路径下创建 2 个配置文件:hello.xml 和 larry.properties。
3、在 src/main/resources 路径下创建 2 个配置文件:jdbc.properties 和 SqlMapConfig.xml。
4、编译 maven_11 模块,查看配置文件情况。
结果如下图所示:
- src/main/java/cn/myphoenix 路径下的 2 个配置文件在编译后消失了。
- src/main/resources 路径下的 2 个配置文件依旧存在。
演示二:将配置文件的路径配置在 pom.xml 文件中,解决编译丢失问题
1、将两个路径下的配置文件都配置到 pom.xml 文件中。
<build><resources><!--src/main/java路径--><resource><directory>src/main/java</directory><includes><include>**/*xml</include><include>**/*properties</include></includes></resource><!--src/main/resources路径--><resource><directory>src/main/resources</directory><includes><include>**/*xml</include><include>**/*properties</include></includes></resource></resources>
</build>
2、clean 并重新编译 maven_11 模块,查看配置文件情况,成功。
附:pom 配置项解读
<build><resources><resource><directory>src/main/resources</directory><includes><include>**/*xml</include><include>**/*properties</include></includes></resource></resources> </build>
解释:
- :这是 Maven 构建配置的根元素,包含了所有与构建相关的配置信息。
- :用于定义项目中的资源文件。资源文件是指那些不需要编译但需要包含在最终构建输出中的文件,例如配置文件、静态文件等。
- :表示一个资源文件集的配置。
- src/main/resources:指定资源文件的来源目录,这里是项目的 src/main/resources 目录。
- :定义哪些文件应该被包含在构建过程中。 标签内可以包含多个 子标签,每个子标签指定一个文件匹配模式。
- **/*xml:匹配所有以 .xml 结尾的文件,无论它们位于 src/main/resources 目录下的哪个子目录中。
**/
表示递归匹配所有子目录,因此即使文件位于深层子目录中,也会被包含进来。- **/*properties:匹配所有以 .properties 结尾的文件,无论它们位于 src/main/resources 目录下的哪个子目录中。
附:在 big-marketing-13119-lwh-app 的 pom.xml 中同样配置了配置文件的路径:
<resources><resource><directory>src/main/resources</directory><filtering>true</filtering><includes><include>**/**</include></includes></resource> </resources><testResources><testResource><directory>src/test/resources</directory><filtering>true</filtering><includes><include>**/**</include></includes></testResource> </testResources>
相关文章:
【Maven】依赖管理
4. Maven的依赖管理 在 Java 开发中,项目的依赖管理是一项重要任务。通过合理管理项目的依赖关系,我们可以有效的管理第三方库,模块的引用及版本控制。而 Maven 作为一个强大的构建工具和依赖管理工具,为我们提供了便捷的方式来管…...
leetcode——移除数组
26.删除有序数组中的重复项 给你一个 非严格递增排列 的数组 nums ,请你 原地 删除重复出现的元素,使每个元素 只出现一次 ,返回删除后数组的新长度。元素的 相对顺序 应该保持 一致 。然后返回 nums 中唯一元素的个数。 考虑 nums 的唯一元素…...
vue项目部署到github pages后页面显示不出来??
问题: 当我们在命令行执行 npm run build 后,项目的目录下会生成一个 dist 文件夹,它里面又包含一个 static 文件夹和一个 index.html 文件,这是 webpack 最终打包好的文件 项目上传到仓库后发现页面为空,找不到文件路…...
为什么爱用低秩矩阵
目录 为什么爱用低秩矩阵 一、定义与性质 二、区别与例子 为什么爱用低秩矩阵 我们更多地提及低秩分解而非满秩分解,主要是因为低秩分解在数据压缩、噪声去除、模型简化和特征提取等方面具有显著的优势。而满秩分解虽然能够保持数据的完整性,但在实际应用中的场景较为有限…...
如何在MySQL中计算两个日期的间隔天数
目录 1. DATEDIFF函数2. TIMESTAMPDIFF函数3. PERIOD_DIFF函数4. 函数对比 在MySQL 5.7中,计算两个日期之间的间隔天数是一项常见的任务。 1. DATEDIFF函数 DATEDIFF函数可以直接计算两个日期之间的天数差异。 -- 计算2024年1月1日和2024年1月10日之间的天数差异 …...
SQL面试题——抖音SQL面试题 共同问题—共同使用ip用户检测问题
共同使用ip用户检测问题 现有用户登录日志表,记录了每个用户登录的IP地址,请查询共同使用过3个及以上IP的用户对; +---+--------------+-------------------+ | id| ip| etime| +---+--------------+-------------------+ | 2|223.104.41.101|20…...
python学习笔记2
下载安装PyCharm 打开pycharm官网: https://www.jetbrains.com.cn/en-us/pycharm/download/?sectionwindows 找到社区版(免费) 下载之后打开,不停下一步就行 打开pycharm软件后,新建py文件 基本输出:…...
IS-IS的原理
IS-IS的基本概念: 概述: IS-IS,中间系统到中间系统,是ISO国际标准化组织为它的无连接网络协议设计的一种动态路由协议 IS-IS支持CLNP网络和IP网络,采用数据链路层封装,区别于ospf只支持IP网络࿰…...
现代应用程序中基于 Cell 架构的安全防护之道
在飞速发展的软件开发领域,基于 Cell 的架构日益流行起来。其概念源自船舶舱壁的设计准则,即单独的水密舱室能允许故障孤立存在。通过将这个概念应用于软件,我们创建了一个架构,将应用程序划分为离散的、可管理的组件,…...
Rust : 生成日历管理markdown文件的小工具
需求: 拟生成以下markdown管理小工具,这也是我日常工作日程表。 可以输入任意时间段,运行后就可以生成以上的markdown文件。 一、toml [package] name "rust-workfile" version "0.1.0" edition "2021"[d…...
Burp Suite 全面解析:开启你的 Web 安全测试之旅
声明! 学习视频来自B站up主 **泷羽sec** 有兴趣的师傅可以关注一下,如涉及侵权马上删除文章,笔记只是方便各位师傅的学习和探讨,文章所提到的网站以及内容,只做学习交流,其他均与本人以及泷羽sec团队无关&a…...
RocketMQ: 消息积压问题的解决
概述 1 ) 什么是消息积压 在分布式消息系统中,消息积压是指消息生产速度超过消息消费速度,导致未处理的消息在消息队列中累积的现象这种现象可能会导致系统性能下降、资源占用增加,甚至影响系统的正常运行 2 )消息积…...
Qt的定时器应用案例 || Qt的图片添加显示
目录 1.ui界面 2.头文件 3.cpp源文件 4.main文件 5.关于ui_mytimerevent.h的代码编译错误 6.图片的添加展示方式 7.结果展示 8.参考文章 1.ui界面 2.头文件 #ifndef MYTIMEREVENT_H #define MYTIMEREVENT_H#include <QMainWindow> #include <QTime> //#in…...
24.12.02 Element
import { createApp } from vue // 引入elementPlus js库 css库 import ElementPlus from element-plus import element-plus/dist/index.css //中文语言包 import zhCn from element-plus/es/locale/lang/zh-cn //图标库 import * as ElementPlusIconsVue from element-plus/i…...
web安全攻防入门教程
Web安全攻防入门教程 Web安全攻防是指在Web应用程序的开发、部署和运行过程中,保护Web应用免受攻击和恶意行为的技术与策略。这个领域不仅涉及防御措施的实现,还包括通过渗透测试、漏洞挖掘和模拟攻击来识别潜在的安全问题。 本教程将带你入门Web安全攻…...
Android——android相对布局(RelativeLayout)及各属性
参考:Android——android相对布局(RelativeLayout)及属性 - 艺言弈行 - 博客园 (cnblogs.com)...
初窥 HTTP 缓存
引言 对于前端来说, 你肯定听说过 HTTP 缓存。 当然不管你知不知道它, 对于提高网站性能和用户体验, 它都扮演着重要的角色! 它通过在客户端和服务器之间存储和重用先前获取的资源副本, 来减少网络流量和降低资源加载时间, 从而提升用户体验! 以下是 HTTP 缓存的重要性: 减少…...
【LeetCode】3. 哈希表: 字母异位词分组;有效的数独
题目 字母异位词分组 给你一个字符串数组,请你将 字母异位词 组合在一起。可以按任意顺序返回结果列表。 字母异位词 是由重新排列源单词的所有字母得到的一个新单词。 示例 1: 输入: strs [“eat”, “tea”, “tan”, “ate”, “nat”, “bat”] 输出: [[“…...
设计模式之抽象工厂 C# 范例
在设计模式中,抽象工厂模式(Abstract Factory Pattern) 是一种创建型模式,它提供一个接口,用于创建一组相关或相互依赖的对象,而无需指定具体类。这种模式的关键在于通过抽象工厂来封装产品的创建ÿ…...
基于Python的猎聘网招聘数据采集与可视化分析
1.1项目简介 在现代社会,招聘市场的竞争日趋激烈,企业和求职者都希望能够更有效地找到合适的机会与人才。猎聘网作为国内领先的人力资源服务平台,汇聚了大量的招聘信息和求职者数据,为研究招聘市场趋势提供了丰富的素材。基于Pyt…...
oracle数据库的启动与关闭
一.oracle数据库的启动过程 启动实例(Start the Instance) 启动实例:一个Oracle数据库实例由内存结构和后台进程组成,启动实例时会加载这些内存结构和启动进程。实例是数据库的一个运行时环境,它包含了数据库的控制文…...
openGauss开源数据库实战十六
文章目录 任务十六 openGauss逻辑结构:触发器管理任务目标实施步骤一、测试openGauss的触发器1.创建测试表2.创建触发器对应的函数3.创建触发器4.测试触发器 二、触发器的类型1.行级触发器2.语句级触发器3.AFTER触发器和 BEFORE触发器 任务十六 openGauss逻辑结构:触发器管理 …...
智能教育的关键之一是构建智能学习系统
教育部办公厅12月27日发布《关于加强中小学人工智能教育的通知》,提出人工智能教育六大主要任务和举措,包括构建系统化课程体系、实施常态化教学与评价、开发普适化教学资源、建设泛在化教学环境、推动规模化教师供给和组织多样化交流活动。《通知》提出…...
【Linux 篇】Docker 容器星河与镜像灯塔:Linux 系统下解锁应用部署奇幻征程
文章目录 【Linux 篇】Docker 容器星河与镜像灯塔:Linux 系统下解锁应用部署奇幻征程前言一 、docker上部署mysql1. 拉取mysql镜像2. 创建容器3. 远程登录mysql 二 、docker上部署nginx1. 拉取nginx镜像2. 在dockerTar目录下 上传nginx.tar rz命令3. 创建nginx容器4…...
十四(AJAX)、AJAX、axios、常用请求方法(GET POST...)、HTTP协议、接口文档、form-serialize
1. AJAX介绍及axios基本使用 <!DOCTYPE html> <html lang"zh-CN"><head><meta charset"UTF-8" /><meta http-equiv"X-UA-Compatible" content"IEedge" /><meta name"viewport" content&q…...
雪花算法生成ID
下面将简单介绍雪花算法的简单应用和在web应用中的使用。 雪花算法的组成:雪花算法是由64位组成:符号位(1)、时间戳(41)、机器码(5[数据中心]5[机器ID])、计数器(12) 对于雪花算法的源码可以在这里看:bwmarrin/snowflake: A simple to use …...
Java - JSR223规范解读_在JVM上实现多语言支持
文章目录 1. 概述2. 核心目标3. 支持的脚本语言4. 主要接口5. 脚本引擎的使用执行JavaScript脚本执行groovy脚本1. Groovy简介2. Groovy脚本示例3. 如何在Java中集成 Groovy4. 集成注意事项 6. 与Java集成7. 常见应用场景8. 优缺点9. 总结 1. 概述 JSR223(Java Spe…...
vue3 基本使用
Vue 3 提供了多种方式来构建用户界面,包括选项式 API 和 Composition API。下面我将详细介绍 Vue 3 的基本使用和语法,主要集中在选项式 API 上,因为这对于初学者来说更容易上手。 1. 创建 Vue 项目 如果你还没有一个 Vue 项目,…...
Redis自学之路—高级特性(实现消息队列)(七)
目录 简介 Redis的Key和Value的数据结构组织 全局哈希表 渐进式rehash 发布和订阅 操作命令 publish 发布消息 subscribe 订阅消息 psubscribe订阅频道 unsubscribe 取消订阅一个或多个频道 punsubscribe 取消订阅一个或多个模式 查询订阅情况-查看活跃的频道 查询…...
ROS基本框架2——在ROS开发中创建并使用自定义消息(C++版本)
ROS基本框架2——在ROS开发中创建并使用自定义消息(C++版本) code review! 参考笔记 1.ROS基本框架1——编写简单的发布者和订阅者(C++和Python版本) 2.ROS基本框架2——在ROS开发中创建并使用自定义消息(C++版本) 文章目录 ROS基本框架2——在ROS开发中创建并使用自定义…...
计算机的错误计算(一百七十二)
摘要 探讨 MATLAB 对于算式 的计算误差。 例1. 在 MATLAB 中计算 的值。 直接贴图吧: 这样,MATLAB 的输出中只有3位正确数字,有效数字的错误率为 (16-3)/16 81.25% . 因为16位的正确输出为 0.2971242332737277e-18(ISReals…...
贵州大学oj平台高级语言第九次作业(四)
题目:链表的基础操作 题目描述 链表是软件中一种最基本的数据结构,它是用链式存储结构实现数据存储的线性表。它较顺序表(如数组)而言在插入和删除数据时不必移动其后的大批量元素。现在给你一些整数,然后会频繁地插入和删除其中的某些元素&a…...
手机卡限速丨中国移动5G变3G,网速500kb
以下猜测错误,又有新的猜测:河南移动的卡出省限速。可能是因为流量结算。 “2024年7月1日起,中国移动集团内部将开启跨省流量结算” 在深圳四五年了,之前没有过,就从上个月开始。11月底解除限速,12月刚开…...
种花问题算法
假设有一个很长的花坛,一部分地块种植了花,另一部分却没有。可是,花不能种植在相邻的地块上,它们会争夺水源,两者都会死去。 给你一个整数数组 flowerbed 表示花坛,由若干 0 和 1 组成,其中 0 …...
Node.js-Mongodb数据库
MongoDB MongoDB是什么? MongoDB是一个基于分布式文件存储的数据库 数据库是什么? 数据库(DataBase)是按照数据结构来组织、存储和管理数据的应用程序(软件) 数据库作用? 对数据进行增、删…...
Nginx
目录 基本介绍 Nginx核心功能 Nginx下载&安装&启动 配置防火墙 Nginx常用命令 Nginx配置文件 全局块 events块 http块 http全局块 server 块 检查配置信息 快速入门 安装JDK 安装Tomcat 反向代理分析 Location语法规则 反向代理配置-Location实例 …...
CTF-PWN: 全保护下格式化字符串利用 [第一届“吾杯”网络安全技能大赛 如果能重来] 赛后学习(没思路了)
通过网盘分享的文件:如果能重来.zip 链接: https://pan.baidu.com/s/1XKIJx32nWVcSpKiWFQGpYA?pwd1111 提取码: 1111 --来自百度网盘超级会员v2的分享漏洞分析 格式化字符串漏洞,在printf(format); __int64 sub_13D7() {char format[56]; // [rsp10h] [rbp-40h]…...
HTML5系列(7)-- Web Storage 实战指南
前端技术探索系列:HTML5 Web Storage 实战指南 🗄️ 致读者:本地存储的新纪元 👋 前端开发者们, 今天我们将深入探讨 HTML5 中的 Web Storage 技术,这是一个强大的本地存储解决方案,让我们能…...
RocketMQ: 保证消息的可靠性投递
概述 在分布式系统中,消息队列作为异步通信的重要组件,其可靠性和稳定性至关重要RocketMQ 是阿里巴巴开源的一款高性能、高可靠性的分布式消息中间件,广泛应用于各种场景,如交易订单处理、日志收集、流计算等 RocketMQ 的可靠性…...
消息传递神经网络(Message Passing Neural Networks, MPNN)
消息传递神经网络(Message Passing Neural Networks, MPNN) 一、引言二、消息传递框架概述1.消息传递阶段(1)消息生成与传播-message(2)消息聚合-aggregate(3)消息更新-update&#…...
Python干货总结篇:列表、字典、集合、元组的区别与用途
前言: 更详细知识点,搞懂列表、字典、集合、元组到底是什么,可关注主页文章:Python知识点精汇! 目录 一、特点与用途 1.列表:a[ ] 2.集合:a{ } 3.字典:a{key:value} 4.元组&am…...
vue.js学习(day 18)
实例:面经基础版...
【Gitlab】CICD使用minio作为分布式缓存
1、安装minio 下载适合自己系统版本的安装文件https://dl.min.io/server/minio/release/windows-amd64/ yum install xxx.rpm 2、配置/etc/profile export MINIO_ACCESS_KEYroot [ui登录账号] export MINIO_SECRET_KEYminioDev001 [ui登录密码] export MINIO_OPTS"…...
医院管理系统
私信我获取源码和万字论文,制作不易,感谢点赞支持。 医院管理系统 摘要 随着信息互联网信息的飞速发展,医院也在创建着属于自己的管理系统。本文介绍了医院管理系统的开发全过程。通过分析企业对于医院管理系统的需求,创建了一个计…...
编译器优化技术
方法内联 逃逸分析 公共子表达式消除 数据边界检查消除...
高斯消元——acwing
题目一:高斯消元解线性方程组 883. 高斯消元解线性方程组 - AcWing题库 分析 代码 #include<bits/stdc.h> using namespace std;const int N 110; const double eps 1e-6; // 注意了double, 和1e-6 ,,这样才是double的0 int n;double a[N][N];int guass…...
华为关键词覆盖应用市场ASO优化覆盖技巧
在我国的消费者群体当中,华为的品牌形象较高,且产品质量过硬,因此用户基数也大。与此同时,随着影响力的增大,华为不断向外扩张,也逐渐成为了海外市场的香饽饽。作为开发者和运营者,我们要认识到…...
[代码随想录06]哈希表的使用,有效字母异位词,两数组交集,快乐数,两数之和
前言 哈希表是什么?一句话带你理解,简单来说我们对于杂乱的数据,怎么快速找到数据,如何做呢?一般的做法就是遍历复杂度为o(N)去找寻一个数据,但是吧,我们这样思考的话,还是花了大量时…...
linux网络抓包工具
linux网络抓包工具 一、tcpdump1.1 基本用法1.2 龙芯平台实例操作 二、wireshark2.1 主要功能2.2 龙芯平台实例操作 一、tcpdump tcpdump 指令可列出经过指定网络界面的数据包文件头,可以将网络中传送的数据包的 “头” 完全截获下来提供分析。它支持针对网络层、协…...
运维工程师.云计算工程师面试题.考试题
《(全国)运维自动化阶段第1套卷》 卷面总分 题号 单选题 90 题分 得分 一、单选题(每题2分,共计70分;得分____) 1. 下面哪个选项可以做变量名称?( ) A、if B、123abc C、for D、User_Name 2. 哪种数据类型可以做增,删,改相关操作?( ) A、字符串 B、列表 C、元…...