从零到一:Maven 快速入门教程
目录
- Maven 简介
- Maven 是什么
- 为什么使用 Maven?
- 安装 Maven
- 下载 Maven
- 配置 Maven
- 解压文件
- 配置本地仓库保存路径
- 配置国内仓库地址
- Maven 的核心概念
- 了解 pom.xml 文件
- 坐标
- 依赖范围
- 生命周期
- compile
- provided
- runtime
- test
- system
- import
- 依赖传递
- 依赖排除
- 依赖循环
- 继承
- 1. Maven 继承的基本概念
- 2. 如何使用 Maven 继承
- 2.1 创建父项目 `pom.xml`
- 2.2 创建子项目 `pom.xml`
- build 标签组成
- 生命周期插件
- 常见的生命周期插件示例
- SpringBoot 定制化打包
- Reference
Maven 简介
Maven 是什么
Maven 是 Apache 软件基金会开发的一个项目管理和构建自动化工具,主要用于 Java 项目。它可以:
- 管理项目的依赖(比如第三方库)
- 自动构建项目(编译、打包)
- 管理项目的生命周期(从创建到发布)
- 管理插件(自动化任务,如测试、代码检查)
一个 Maven 工程遵循约定的目录结构,这种标准化的目录布局是 Maven 实现自动化构建过程中不可或缺的关键环节。Maven 推荐采用统一的目录结构,以确保项目的一致性和构建过程的高效性。
project-name/
├── src/
│ ├── main/
│ │ └── java/ # 主代码
│ └── test/
│ └── java/ # 测试代码
├── pom.xml # Maven 配置文件
为什么使用 Maven?
传统 Java 项目可能要手动:
- 下载 JAR 包(第三方库)
- 配置类路径(classpath)
- 编译源代码
- 打包成 jar/war 文件
Maven 全部帮你做了!它像一个「项目自动管家」,你只需写好配置文件(pom.xml
),Maven 会自动根据配置从仓库中拉取依赖。
安装 Maven
下载 Maven
下载地址:https://maven.apache.org/download.cgi
你可以下载最新版本的 Maven,也可以选择其他版本
然后里面选择自己对应的版本下载即可:
配置 Maven
解压文件
下载之后,解压到非中文的文件目录,如下:
配置本地仓库保存路径
Maven 会在每次从远程仓库获取第三方依赖后,将其缓存至本地指定的存储路径中。这一机制有效避免了在每次构建新项目时重复从远程仓库拉取相同依赖的情况,从而显著提升了开发效率并减少了不必要的网络开销。
<!-- localRepository
| The path to the local repository maven will use to store artifacts.
|
| Default: ${user.home}/.m2/repository
-->
<localRepository>D:\Environment\Repository</localRepository>
本地仓库默认值:用户/.m2/repository。由于本地仓库的默认位置是在用户的家目录下,而家目录往往是在 C 盘,也就是系统盘。将来 Maven 仓库中 jar 包越来越多,仓库体积越来越大,可能会拖慢 C 盘运行速度,影响系统性能。
配置国内仓库地址
Maven 下载 jar 包默认访问境外的中央仓库,而国外网站速度很慢。改成阿里云提供的镜像仓库,访问国内网站,可以让 Maven 下载 jar 包的时候速度更快。配置的方式是:
<mirror><id>tencent</id><name>tencent maven</name><url>http://mirrors.cloud.tencent.com/nexus/repository/maven-public/</url><mirrorOf>central</mirrorOf>
</mirror><mirror><id>nexus-aliyun</id><mirrorOf>central</mirrorOf><name>Nexus aliyun</name><url>http://maven.aliyun.com/nexus/content/groups/public</url>
</mirror>
Maven 的核心概念
了解 pom.xml 文件
pom.xml
(Project Object Model)是 Maven 项目的核心配置文件,其主要功能在于对项目的全面描述与定义,包括但不限于以下内容:
- 项目元信息:定义项目的基本信息,如名称、版本、组织等标识性数据。
- 依赖管理:声明项目所依赖的外部库及其版本,确保构建过程中的依赖解析与一致性。
- 构建配置:指定项目的构建规则,包括编译、测试、打包等生命周期阶段的具体行为。
- 插件与扩展:配置用于增强构建能力的插件及扩展模块,支持定制化构建需求。
通过 pom.xml
,Maven 实现了项目结构的标准化与构建过程的自动化,为开发者提供了高效且可维护的项目管理工具。
<project xmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><!-- 当前Maven工程的坐标 --><groupId>com.example</groupId><artifactId>demo</artifactId><version>0.0.1-SNAPSHOT</version><name>demo</name><description>Demo project for Spring Boot</description><!-- 当前Maven工程的打包方式,可选值有下面三种: --><!-- jar:表示这个工程是一个Java工程 --><!-- war:表示这个工程是一个Web工程 --><!-- pom:表示这个工程是“管理其他工程”的工程 --><packaging>jar</packaging><properties><!-- 工程构建过程中读取源码时使用的字符集 --><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding></properties><!-- 当前工程所依赖的jar包 --><dependencies><dependency><!-- 在dependency标签内使用具体的坐标依赖我们需要的一个jar包 --><groupId>junit</groupId><artifactId>junit</artifactId><version>4.12</version><!-- scope标签配置依赖的范围 --><scope>test</scope></dependency></dependencies><!-- 构建配置 --><build><plugins><!-- 编译插件 --><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-compiler-plugin</artifactId><version>3.10.1</version><configuration><source>1.8</source><target>1.8</target></configuration></plugin></plugins></build>
</project>
坐标

每一个依赖(或项目)都有三个关键标识:
groupId
:组织名,一般是域名反写,如org.springframework
artifactId
:模块名,如spring-core
version
:版本号,如5.3.10
合起来可以唯一确定一个库,如下:
<groupId>javax.servlet</groupId>
<artifactId>servlet-api</artifactId>
<version>2.5</version>
<scope>compile</scope>
项目首次运行时,会从远程仓库拉取依赖,并保存到本地仓库
上面坐标对应的 jar 包在 Maven 本地仓库中的位置:
Maven本地仓库根目录\javax\servlet\servlet-api\2.5\servlet-api-2.5.jar
依赖范围
在 Maven 中,依赖范围(Dependency Scope)决定了一个依赖在构建过程中的可用性和传播性。
Maven 的生命周期如下:编译、测试、运行、打包。
不同的范围影响了该依赖在不同生命周期阶段的行为,即<scope>
标签。
<dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>4.12</version><!-- scope标签配置依赖的范围 --><scope>test</scope>
</dependency>
Maven 提供了几种常用的依赖范围类型,每种类型有不同的含义和使用场景。
生命周期
编译:将 Java 源代码文件(.java
文件)转换为 字节码(.class
文件),这是 Java 虚拟机(JVM)能够执行的代码。
测试: 执行单元测试(Unit Test)和集成测试(Integration Test)等。
运行:项目最终的运行时环境中。
打包:将当前项目打包成 Jar 或者 War 包。
compile
描述:compile
范围是 Maven 依赖的默认范围。如果你没有显式指定依赖的范围,它会自动使用 compile
范围。compile
范围表示该依赖在编译、测试、运行时都需要。
可用阶段:
- 编译时:可以使用
- 测试时:可以使用
- 运行时:可以使用
- 打包时:包含在最终的构件中
常见场景:适用于大多数的应用程序库,通常是核心依赖。
示例:
<dependency><groupId>com.example</groupId><artifactId>some-library</artifactId><version>1.0</version>
</dependency>
provided
描述:provided
范围表示该依赖在编译和测试时需要,但在运行时由容器或运行时环境提供。典型的例子是 Web 应用程序中的 Servlet API,它在 Web 容器(如 Tomcat)中已经提供,因此不需要在最终的构件中包含该依赖。
可用阶段:
- 编译时:可以使用
- 测试时:可以使用
- 运行时:不包含
- 打包时:不包含(因为容器已经提供了该依赖)
常见场景:Web 项目中的容器依赖(如 servlet-api
)或者一些 Java EE API。
示例:
<dependency><groupId>javax.servlet</groupId><artifactId>servlet-api</artifactId><version>3.1.0</version><scope>provided</scope>
</dependency>
runtime
描述:runtime
范围表示该依赖在运行时需要,但在编译时不需要。通常这种范围适用于某些在运行时才需要的库,比如数据库驱动程序或者日志框架。
可用阶段:
- 编译时:不需要
- 测试时:可以使用
- 运行时:需要
- 打包时:包含
常见场景:用于运行时需要的库,通常是数据库连接池、日志框架等。
示例:
<dependency><groupId>com.mysql</groupId><artifactId>mysql-connector-java</artifactId><version>5.1.49</version><scope>runtime</scope>
</dependency>
test
描述:test
范围表示该依赖仅在测试时需要。它不会在项目的运行时或者生产环境中包含。通常用于单元测试框架(如 JUnit 或 TestNG)和一些测试工具。
可用阶段:
- 编译时:可以使用
- 测试时:可以使用
- 运行时:不需要
- 打包时:不包含
常见场景:单元测试框架(JUnit、TestNG)、模拟库(Mockito)等。
示例:
<dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>4.12</version><scope>test</scope>
</dependency>
system
描述:system
范围表示该依赖位于项目外部(如本地文件系统中)。它不是从远程仓库下载的,而是通过文件路径直接引用。system
范围的依赖必须指定 systemPath
属性,该路径指向文件的实际位置。
可用阶段:
- 编译时:可以使用
- 测试时:可以使用
- 运行时:需要
- 打包时:包含
示例:
<dependency><groupId>com.example</groupId><artifactId>some-library</artifactId><version>1.0</version><scope>system</scope><systemPath>${project.basedir}/lib/some-library.jar</systemPath>
</dependency>
注意:不推荐使用
system
范围,因为它不具备跨平台的特性,依赖文件路径是硬编码的,缺乏可移植性。
import
描述:import
范围主要用于导入 BOM(Bill of Materials)类型的依赖,它不会像普通的依赖那样将 JAR 文件直接添加到构建中,而是通过继承管理的一组版本。常用于依赖管理(dependencyManagement
)的场景,通常在多模块项目中,或者用于引入其他项目的版本管理。
可用阶段:
- 编译时:不可用
- 测试时:不可用
- 运行时:不可用
- 打包时:不可用
常见场景:用于在父项目中管理子模块的依赖版本,或引用第三方库的版本管理。
示例:
<dependencyManagement><dependencies><dependency><groupId>org.springframework</groupId><artifactId>spring-core</artifactId><version>4.3.7.RELEASE</version><scope>import</scope><type>pom</type></dependency></dependencies>
</dependencyManagement>
依赖传递
Maven 支持依赖传递,即当一个项目依赖于某个库时,若该库本身依赖其他库,这些依赖会自动成为当前项目的依赖,直到最终没有更多的传递依赖为止。
假设我们有以下的项目依赖关系:
- 项目
A
依赖项目B
。 - 项目
B
依赖项目C
。 - 项目
A
和B
不需要直接依赖C
,就可以引入mysql-connector-java
和lombok
依赖
通过执行依赖树:
mvn dependency:tree
输出结果
[INFO] com.example:project-A:jar:1.0
[INFO] +- com.example:library-B:jar:1.0:compile
[INFO] | +- com.example:library-C:jar:1.0:compile
[INFO] | | +- mysql:mysql-connector-java:jar:8.0.23:compile
[INFO] | | \- org.projectlombok:lombok:jar:1.18.20:provided
[INFO] \- (omitted for brevity)
依赖排除
如果 A
项目现在不需要使用 mysql 的依赖或者单独使用其他版本的依赖,应该如何处理呢?
Maven 提供了依赖排除的工程,避免版本冲突或者不必要的依赖,可以在 pom
文件中进行配置。
<!-- A项目的坐标 -->
<groupId>com.example</groupId>
<artifactId>project-A</artifactId>
<version>1.0</version><dependencies><!-- A 项目依赖 B 项目 --><dependency><groupId>com.example</groupId><artifactId>library-B</artifactId><version>1.0</version><exclusions><!-- 排除 C 项目传递的 MySQL 依赖 --><exclusion><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId></exclusion></exclusions></dependency>
</dependencies>
通过执行依赖树:
mvn dependency:tree
输出结果
[INFO] com.example:project-A:jar:1.0
[INFO] +- com.example:library-B:jar:1.0:compile
[INFO] | +- com.example:library-C:jar:1.0:compile
[INFO] | \- org.projectlombok:lombok:jar:1.18.20:provided
[INFO] \- (omitted for brevity)
MySQL 依赖没有出现在依赖树中,因为我们通过 <exclusions>
明确排除了 MySQL
依赖。
依赖循环

如果 A
工程依赖 B
工程,B
工程依赖 C
工程,C
工程又反过来依赖 A
工程,那么在执行构建操作时会报下面的错误:
[ERROR] [ERROR] The projects in the reactor contain a cyclic reference:
继承
Maven 的 继承 是一种在多模块项目或父子项目之间共享配置的机制。通过继承,子项目可以继承父项目的依赖、插件、属性、版本信息等配置,减少冗余的配置,提高可维护性。父子项目的关系是通过 parent
元素在 pom.xml
中实现的。
1. Maven 继承的基本概念
父项目(Parent Project):一个包含通用配置和版本管理的项目,其他子项目可以继承这些配置。
子项目(Child Project):继承父项目的 pom.xml
中定义的配置,包括依赖、插件、构建配置等
2. 如何使用 Maven 继承
2.1 创建父项目 pom.xml
父项目 pom.xml
中可以定义通用的配置,例如依赖版本、插件配置、构建配置等。然后,子项目通过 <parent>
元素继承这些配置。
父项目的 pom.xml
示例:
<project xmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0http://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><groupId>com.example</groupId><artifactId>parent-project</artifactId><version>1.0-SNAPSHOT</version><packaging>pom</packaging> <!-- 父项目的打包类型通常是 pom --><!-- 指定子项目 --><modules><module>child-project</module></modules><dependencyManagement><dependencies><!-- 在父项目中声明的依赖版本会被所有子项目继承 --><dependency><groupId>org.springframework</groupId><artifactId>spring-core</artifactId><version>5.3.9</version></dependency></dependencies></dependencyManagement><build><pluginManagement><plugins><!-- 子项目会继承父项目的插件配置 --><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-compiler-plugin</artifactId><version>3.8.1</version><configuration><source>1.8</source><target>1.8</target></configuration></plugin></plugins></pluginManagement></build></project>
在这个父项目中:
dependencyManagement
:管理所有子项目中共享的依赖版本。pluginManagement
:定义了子项目共享的插件和插件的配置。
2.2 创建子项目 pom.xml
子项目通过 <parent>
元素来继承父项目的配置。子项目的 pom.xml
中需要指明父项目的 groupId
、artifactId
和 version
。
子项目的 pom.xml
示例:
<project xmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0http://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><!-- 父项目坐标 --><parent><groupId>com.example</groupId><artifactId>parent-project</artifactId><version>1.0-SNAPSHOT</version></parent><artifactId>child-project</artifactId><dependencies><!-- 继承父项目的 spring-core 依赖,版本由父项目提供 --><dependency><groupId>org.springframework</groupId><artifactId>spring-core</artifactId></dependency></dependencies><build><plugins><!-- 子项目继承父项目的插件配置 --><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-compiler-plugin</artifactId></plugin></plugins></build></project>
在这个子项目中:
- 子项目 继承了父项目的依赖管理,因此不需要在子项目中显式地指定
spring-core
的版本。 - 子项目 继承了父项目的插件配置,因此不需要重新定义
maven-compiler-plugin
插件的版本和配置。
build 标签组成
生命周期插件
Maven 使用插件来执行不同生命周期阶段的任务,如编译、测试、打包等。每个生命周期都有多个阶段,而插件负责在这些阶段执行实际的任务。Maven 默认有多个生命周期,比如 清理生命周期、默认生命周期 和 站点生命周期。通过 build
标签中的 <plugins>
元素,你可以为不同的生命周期阶段指定插件。
常见的生命周期插件示例
- maven-compiler-plugin:用于编译 Java 代码
- maven-surefire-plugin:用于运行单元测试
- maven-jar-plugin:用于打包 JAR 文件
- maven-war-plugin:用于打包 WAR 文件
<build><plugins><!-- 编译插件 --><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-compiler-plugin</artifactId><version>3.8.1</version><configuration><source>1.8</source> <!-- 指定编译的 JDK 版本 --><target>1.8</target> <!-- 指定目标 JDK 版本 --></configuration></plugin><!-- 单元测试插件 --><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-surefire-plugin</artifactId><version>2.22.2</version></plugin><!-- JAR 打包插件 --><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-jar-plugin</artifactId><version>3.1.0</version><configuration><finalName>my-app</finalName></configuration></plugin></plugins>
</build>
在上面的示例中,指定了三个常用的插件:
maven-compiler-plugin
:用于指定编译的 JDK 版本。maven-surefire-plugin
:用于运行单元测试。maven-jar-plugin
:用于创建 JAR 文件,并指定输出文件名。
SpringBoot 定制化打包
Spring Boot 提供了非常灵活的构建和打包方式,你可以通过 Maven 插件来定制 Spring Boot 项目的打包过程。Spring Boot 使用 spring-boot-maven-plugin
插件来创建可执行的 JAR 或 WAR 文件。
<build><plugins><!-- Spring Boot Maven 插件 --><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId><version>2.5.2</version> <!-- 使用的 Spring Boot 版本 --><configuration><finalName>my-springboot-app</finalName> <!-- 打包后的文件名 --></configuration></plugin></plugins>
</build>
Reference
- 超级详细的 Maven 教程(基础+高级)
- https://chatgpt.com/
相关文章:

从零到一:Maven 快速入门教程
目录 Maven 简介Maven 是什么为什么使用 Maven? 安装 Maven下载 Maven 配置 Maven解压文件配置本地仓库保存路径配置国内仓库地址 Maven 的核心概念了解 pom.xml 文件坐标依赖范围生命周期compileprovidedruntimetestsystemimport 依赖传递依赖排除依赖循环 继承1. …...
DDD架构实战 领域层 事件驱动
目录 核心实现: 这种实现方式的优势: 在实际项目中,你可能需要: 事件驱动往往是在一个微服务内部实现的 领域时间是DDD架构中比较常见的概念 在领域层内部的一个模型更改了状态或者发生了一些行为 向外发送一些通知 这些通…...
c# List<string>.Add(s) 报错:UnsupportedOperationException
在使用c#读取目录下指定格式文件目录后,使用List<string>.Add 来保存文件名时,出现UnsupportedOperationException错误,找了好久不知道问题出在哪里。 以下是错误代码: using (var fbd new FolderBrowserDialog{Descripti…...

postman基础
前言 本次 Chat 将结合业界广为推崇和使用的 RestAPI 设计典范 Github API,详细介绍 Postman 接口测试工具的使用方法和实战技巧。 在开始这个教程之前,先聊一下为什么接口测试在现软件行业如此重要? 为什么我们要学习 Postman?…...

python训练营day45
知识点回顾: tensorboard的发展历史和原理tensorboard的常见操作tensorboard在cifar上的实战:MLP和CNN模型 效果展示如下,很适合拿去组会汇报撑页数: 作业:对resnet18在cifar10上采用微调策略下,用tensorbo…...
B+树知识点总结
核心目标:减少磁盘 I/O 数据库系统(如 MySQL)的主要性能瓶颈通常在于磁盘 I/O(读取和写入数据到物理硬盘的速度远慢于内存访问)。B 树的设计核心就是最大限度地减少访问数据时所需的磁盘 I/O 次数。 一、B 树的基本结…...

Halcon透视矩阵
在 Halcon中,透视变换矩阵用于将图像从一个视角转换到另一个视角,常用于图像校正和几何变换。以下是计算透视变换矩阵的步骤及代码示例。 透视形变图像校正的步骤 对图像左简单的处理,分割要校正的区域;提取区域的顶点坐标信息&…...
SpringCloud——OpenFeign
概述: OpenFeign是基于Spring的声明式调用的HTTP客户端,大大简化了编写Web服务客户端的过程,用于快速构建http请求调用其他服务模块。同时也是spring cloud默认选择的服务通信工具。 使用方法: RestTemplate手动构建: // 带查询…...

007-nlohmann/json 项目应用-C++开源库108杰
本课为 fswatch(第一“杰”)的示例项目加上对配置文件读取的支持,同时借助 第三“杰” CLI11 的支持,完美实现命令行参数与配置文件的逻辑统一。 012-nlohmann/json-4-项目应用 项目基于原有的 CMake 项目 HelloFSWatch 修改。 C…...

移动端测试岗位高频面试题及解析
文章目录 一、基础概念二、自动化测试三、性能测试四、专项测试五、安全与稳定性六、高级场景七、实战难题八、其他面题 一、基础概念 移动端测试与Web测试的核心区别? 解析:网络波动(弱网测试)、设备碎片化(机型适配&…...
gvim比较两个文件不同并合并差异
使用 gvim 比较两个文件的不同: 方式一,使用 gvim 同时打开两个待比较的文件。 比较通用方式是采用 gvim -d 选项,具体命令,如下: gvim -d <file1> <file2>方式二,先用 gvim 打开一个文件&am…...
App使用webview套壳引入h5(二)—— app内访问h5,顶部被手机顶部菜单遮挡问题,保留顶部安全距离
引入webview的页面添加safeAreaInsets,对weview的webviewStyles做处理 在myApp中改造 entry.vue代码如下 template><view class"entry-page" :style"{ paddingTop: safeAreaInsets.top px }"><web-view :webview-styles"we…...

Git GitHub Gitee
一、Git 是一个免费、开源的分布式版本控制系统。 版本控制:一种记录文件内容变化,以便将来查阅特定版本修订情况的系统。它最重要的就是可以记录文件修改历史记录,从而让用户可以看历史版本,方便版本切换。 1.和集中式版本控制…...
《深度体验 Egg.js:打造企业级 Node.js 应用的全景指南》
🚀 核心亮点:Koa 的二次觉醒 企业级基因:阿里多年双十一验证的框架稳定性插件化架构:config.plugins 实现功能模块即插即用渐进式演进:从 50 行代码到 5 万行代码的无缝扩容能力 🔧 实战配置解析ÿ…...
蓝桥杯2118 排列字母
问题描述 小蓝要把一个字符串中的字母按其在字母表中的顺序排列。 例如,LANQIAO 排列后为 AAILNOQ。 又如,GOODGOODSTUDYDAYDAYUP 排列后为 AADDDDDGGOOOOPSTUUYYY。 请问对于以下字符串,排列之后字符串是什么? WHERETHEREIS…...
Python应用break初解
大家好!作为 Python 初学者,控制循环的执行是编程中的基础技能之一。在本文中,我们将深入探讨break语句的用途和用法,帮助您更好地理解和掌握这一强大的工具。 定义: break是 Python 中的一个保留关键字,用于在循环中提前终止循环…...

PLSQLDeveloper配置OracleInstantClient连接Oracle数据库
PL/SQLDeveloper配置Oracle Instant Client连接Oracle数据库 文章目录 PL/SQLDeveloper配置Oracle Instant Client连接Oracle数据库 1. Oracle Instant Client下载与配置1. Oracle Instant Client下载2. Oracle Instant Client解压配置1. 解压2. 配置 2. PL/SQL Developer下载、…...
高股息打底+政策催化增强+永续经营兜底
通过分析农业银行(政策红利高股息)与长江电力(垄断资源现金流堡垒)的共性,提炼出以下策略框架: 1. 核心筛选标准 • 高股息防御性:股息率>3%,分红率稳定(40%…...
双电机差速控制的MATLAB Simulink仿真方案,使用PWM和PID调节实现360°转向与速度控制_可复现,有问题请联系博主
以下是一个双电机差速控制的MATLAB Simulink仿真方案,使用PWM和PID调节实现360转向与速度控制。方案包含系统建模、控制策略和仿真实现。 系统模型 差速运动学模型: 线速度 ( v = \frac{v_r + v_l}{2} )角速度 ( \omega = \frac{v_r - v_l}{d} )其中 ( v_r, v_l ) 为右/左轮线…...

【Oracle】触发器
个人主页:Guiat 归属专栏:Oracle 文章目录 1. 触发器基础概述1.1 触发器的概念与特点1.2 触发器的分类1.3 触发器的执行顺序 2. DML触发器2.1 基础DML触发器2.1.1 INSERT触发器2.1.2 UPDATE触发器2.1.3 DELETE触发器 2.2 高级DML触发器2.2.1 复合触发器2…...

基于深度学习的无人机轨迹预测
完整代码见文末 随着无人机技术的不断发展,无人机在农业、物流、监控等领域的应用日益广泛。精准的轨迹预测不仅能够提高无人机飞行的效率和安全性,还能在应对复杂环境下的突发状况时做出迅速反应。因此,基于深度学习的无人机轨迹预测已成为…...

git连接本地仓库以及gitee
参考:gitee创建新仓库并上传代码_gitee新建仓库导入代码-CSDN博客 git初始化以及添加git分支 在idea查看master主分支 报错 原因gitee推送更新失败问题记录:remote: error: hook declined to update refs/heads/master-CSDN博客 取消邮箱暴露...
使用Python和OpenCV实现图像识别与目标检测
在计算机视觉领域,图像识别和目标检测是两个非常重要的任务。图像识别是指识别图像中的内容,例如判断一张图片中是否包含某个特定物体;目标检测则是在图像中定位并识别多个物体的位置和类别。OpenCV是一个功能强大的开源计算机视觉库…...

麒麟v10系统的docker重大问题解决-不支持容器名称解析
今天给客户在麒麟v10Kylin-Server-V10-SP1下安装nextcloudonlyoffice的时候出现无法连接onlyoffice的问题,经过分析找到了是docker版本过低的原因,现在把解决思路和步骤分享给大家。 一、问题 用一键安装工具,给客户装好了系统,Nextcloud可以正常访问 但是访问nextcloud中的o…...

基于5G下行信号的模糊函数分析matlab仿真,对比速度模糊函数和距离模糊函数
目录 1.引言 2.算法仿真效果演示 3.数据集格式或算法参数简介 4.MATLAB部分程序 5.算法涉及理论知识概要 6.参考文献 7.完整算法代码文件获得 1.引言 模糊函数(Ambiguity Function, AF)是信号处理领域用于分析信号时频分辨能力的核心工具…...
Selenium自动下载浏览器驱动
为什么需要自动下载浏览器驱动? 血泪场景重现 新人入职第一天: 花3小时配置Chrome/Firefox驱动版本不匹配导致SessionNotCreatedException 浏览器自动更新后: 所有测试脚本突然崩溃手动查找驱动耗时长 终极解决方案:自动下载驱…...
数据库优化实战分享:高频场景下的性能调优技巧与案例解析
在实际开发与生产运维中,数据库的性能瓶颈往往是影响系统响应速度和用户体验的关键因素。尤其是在高并发访问、海量数据处理、复杂查询逻辑等高频场景下,数据库优化不仅仅是“锦上添花”,更是“雪中送炭”。本篇博文将结合实际项目经验&#…...

Redis 过期了解
Redis 版本:5.0 : 一:过期监听: Spring Data Redis 封装了 Redis 的 Pub/Sub 功能,提供了对 key 过期事件的监听支持。 1. 核心类:KeyExpirationEventMessageListener 这个抽象类是 Spring 提供的&#x…...
微信小程序前端面经
一、技术栈与编码能力(10min) 1. Vue 3 & Composition API Q1:请解释一下 ref 和 reactive 的区别?你在项目中是如何使用的? 答:ref是包装一个原始值或对象,通过.value访问,r…...
android 之 Tombstone
Android 系统中的 Tombstone 是记录 Native 层崩溃信息的关键日志文件,当应用或系统服务因严重错误(如内存访问异常、空指针解引用等)崩溃时自动生成。以下是其核心机制与分析方法详解: 一、Tombstone 的生成机制 触发条件 当 Na…...