【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 作为一个强大的构建工具和依赖管理工具,为我们提供了便捷的方式来管…...
springboot/ssm高校超市管理系统Java商品出入库供应商管理系统web源码wms
springboot/ssm高校超市管理系统Java商品出入库供应商管理系统web源码wms 基于springboot(可改ssm)vue项目 开发语言:Java 框架:springboot/可改ssm vue JDK版本:JDK1.8(或11) 服务器:tomcat 数据库&a…...
小程序-基于java+SpringBoot+Vue的微信小程序养老院系统设计与实现
项目运行 1.运行环境:最好是java jdk 1.8,我们在这个平台上运行的。其他版本理论上也可以。 2.IDE环境:IDEA,Eclipse,Myeclipse都可以。推荐IDEA; 3.tomcat环境:Tomcat 7.x,8.x,9.x版本均可 4.硬件环境:…...
宠物电商对接美团闪购:实现快速配送与用户增值
随着宠物行业的快速发展,宠物电商市场也在不断扩张。消费者的需求不再局限于传统的线上购物模式,越来越多的人开始追求更快捷的配送服务和更优质的购物体验。为了适应这一趋势,许多宠物电商平台开始寻求与本地配送平台合作,以提供…...
Vue中使用<Transition>与<TransitionGroup>
目录 介绍 CSS过渡类 为过渡效果命名 CSS的transition CSS的transform 性能考量 出现时过渡 元素间过渡 过渡模式 使用Key属性过渡 和的区别 进入/离开动画 移动动画 一个购物车飞跃例子 介绍 传统HTML中,我们可以使用CSS属性:“animation”…...
Algorithms and Data Structures in C++ by Mohammed Yasir Eramangadan
MP4 创建 |视频:h264、1280720 |音频:AAC,44.1 KHz,2 通道 类型:在线学习 |语言:英文 字幕 |持续时间: 159 讲座 ( 10h 43m ) |大小: 3.5 GB “通过专家制作…...
2024广东省职业技能大赛云计算——构建CICD 部署2048小游戏
构建CI/CD 前言 题目如下: 构建CI/CD 编写流水线脚本.gitlab-ci.yml触发自动构建,具体要求如下: (1)基于镜像maven:3.6-jdk-8构建项目的drone分支; (2)构建镜像的名称:…...
React 条件渲染
React 条件渲染 React 条件渲染是一种在 React 应用程序中根据不同的条件显示不同组件或内容的技巧。它是 React 响应用户输入、状态变化或数据变化的核心机制之一。本文将深入探讨 React 条件渲染的概念、用法和最佳实践。 目录 条件渲染的基本概念使用 JavaScript 运算符进…...
Hadoop生态圈框架部署(九)- Hive部署
文章目录 前言一、Hive部署(手动部署)下载Hive1. 上传安装包2. 解压Hive安装包2.1 解压2.2 重命名2.3 解决guava冲突 3. 配置Hive3.1 配置Hive环境变量3.2 修改 hive-site.xml 配置文件3.3 配置MySQL驱动包3.3.1 下在MySQL驱动包3.3.2 上传MySQL驱动包3.…...
c语言的qsort函数理解与使用
介绍:qsort 函数是 C 标准库中用于排序的快速排序算法函数。它的用法非常灵活,可以对任意类型的元素进行排序,只要提供了比较函数即可。 qsort 函数原型及参数解释: void qsort ( void* base, //指向要排序的数组的首元素…...
Java 语言的起源发展与基本概念(JDK,JRE,JVM)
Java语言的起源 源起 Java语言最初是由Sun Microsystems公司(该公司于2009年被Oracle公司收购)开发的一种编程语言。其创造者是詹姆斯高斯林(James Gosling),他是一位加拿大计算机科学家。其前身名为Oak(橡…...
03_变量
变量 var num 10; 变量的重新赋值 var num10; num 20; 变量提升 JavaScript 引擎的工作方式是,先解析代码,获取所有被声明的变量,然后再一行一行地运行。这造成的结果,就是所有的变量的声明语句,都会被提升到代码的…...
[论文阅读-综述]Supervised Speech Separation Based on Deep Learning: An Overview
基于深度学习的监督语音分离:综述 出版:IEEE 核心:使用语音分离将目标语音信号与噪声混合分离的计算 本文用于对该文章的学习,主要是对内容的理解翻译与笔记 1. 语音分离介绍 语音分离的目标:将目标语音与背景干扰分…...
群控系统服务端开发模式-应用开发-邮箱配置功能开发
邮箱配置主要是将管理员数据做归属。具体见下图: 一、创建表 1、语句 CREATE TABLE cluster_control.nc_param_mail (id int(11) UNSIGNED NOT NULL AUTO_INCREMENT COMMENT 编号,title varchar(20) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT…...
【机器学习】——卷积与循环的交响曲:神经网络模型在现代科技中的协奏
🎼个人主页:【Y小夜】 😎作者简介:一位双非学校的大二学生,编程爱好者, 专注于基础和实战分享,欢迎私信咨询! 🎆入门专栏:🎇【MySQL࿰…...
android studio引用so库
在工程中编译好的so库文件将在原始编译工程对应目录下:build/intermediates/cxx/Debug/xxxxxx/obj/ 其目录结构如上所示,包含生成的四个版本,每个文件夹下均包含c/c源码编译成的Android版本的libnavi.so库和提供应用接口的libnavi-lib.so库。…...
2024年信号处理与神经网络应用(SPNNA 2024)
会议官网:www.spnna.org 会议时间:2024年12月13-15日 会议地点:中国武汉...
wxWidgets-ImageView
wxWidgets实现图片浏览、放大缩小、另存为新的图片格式等 #include "wx/wxprec.h"#ifndef WX_PRECOMP#include "wx/wx.h" #endif#include "wx/filename.h" #include "wx/zstream.h"#include "imageviewctrl.h"class MyFrame…...
第1章-JVM和Java体系架构
虚拟机 虚拟机概念 所谓虚拟机(Virtual Machine),就是一台虚拟的计算机。它是一款软件,用来执行一系列虚拟计算机指令。大体上,虚拟机可以分为系统虚拟机和程序虚拟机。 大名鼎鼎的Virtual Box,VMware就属…...
windows 服务器角色
windows 服务器角色 Active Directory Rights Management Services Active Directory RightsManagement Services (AD RS)帮助保护信息,防止未授权使用。AD RMS 将建立用户标识,并为授权用户提供受保护信息的许可证。 ServicesActive Directory 联合身…...
web vue 项目 Docker化部署
Web 项目 Docker 化部署详细教程 目录 Web 项目 Docker 化部署概述Dockerfile 详解 构建阶段生产阶段 构建和运行 Docker 镜像 1. Web 项目 Docker 化部署概述 Docker 化部署的主要步骤分为以下几个阶段: 构建阶段(Build Stage):…...
HTML 语义化
目录 HTML 语义化HTML5 新特性HTML 语义化的好处语义化标签的使用场景最佳实践 HTML 语义化 HTML5 新特性 标准答案: 语义化标签: <header>:页头<nav>:导航<main>:主要内容<article>&#x…...
家政维修平台实战20:权限设计
目录 1 获取工人信息2 搭建工人入口3 权限判断总结 目前我们已经搭建好了基础的用户体系,主要是分成几个表,用户表我们是记录用户的基础信息,包括手机、昵称、头像。而工人和员工各有各的表。那么就有一个问题,不同的角色…...
css3笔记 (1) 自用
outline: none 用于移除元素获得焦点时默认的轮廓线 broder:0 用于移除边框 font-size:0 用于设置字体不显示 list-style: none 消除<li> 标签默认样式 margin: xx auto 版心居中 width:100% 通栏 vertical-align 作用于行内元素 / 表格单元格ÿ…...
Swagger和OpenApi的前世今生
Swagger与OpenAPI的关系演进是API标准化进程中的重要篇章,二者共同塑造了现代RESTful API的开发范式。 本期就扒一扒其技术演进的关键节点与核心逻辑: 🔄 一、起源与初创期:Swagger的诞生(2010-2014) 核心…...
ABAP设计模式之---“简单设计原则(Simple Design)”
“Simple Design”(简单设计)是软件开发中的一个重要理念,倡导以最简单的方式实现软件功能,以确保代码清晰易懂、易维护,并在项目需求变化时能够快速适应。 其核心目标是避免复杂和过度设计,遵循“让事情保…...
蓝桥杯 冶炼金属
原题目链接 🔧 冶炼金属转换率推测题解 📜 原题描述 小蓝有一个神奇的炉子用于将普通金属 O O O 冶炼成为一种特殊金属 X X X。这个炉子有一个属性叫转换率 V V V,是一个正整数,表示每 V V V 个普通金属 O O O 可以冶炼出 …...
【JVM面试篇】高频八股汇总——类加载和类加载器
目录 1. 讲一下类加载过程? 2. Java创建对象的过程? 3. 对象的生命周期? 4. 类加载器有哪些? 5. 双亲委派模型的作用(好处)? 6. 讲一下类的加载和双亲委派原则? 7. 双亲委派模…...
【Android】Android 开发 ADB 常用指令
查看当前连接的设备 adb devices 连接设备 adb connect 设备IP 断开已连接的设备 adb disconnect 设备IP 安装应用 adb install 安装包的路径 卸载应用 adb uninstall 应用包名 查看已安装的应用包名 adb shell pm list packages 查看已安装的第三方应用包名 adb shell pm list…...
淘宝扭蛋机小程序系统开发:打造互动性强的购物平台
淘宝扭蛋机小程序系统的开发,旨在打造一个互动性强的购物平台,让用户在购物的同时,能够享受到更多的乐趣和惊喜。 淘宝扭蛋机小程序系统拥有丰富的互动功能。用户可以通过虚拟摇杆操作扭蛋机,实现旋转、抽拉等动作,增…...
