Maven快速上手
在前面我们学习了许多关于JAVA的知识,从今天这个博客开始我们就要进入到JAVAEE进阶的学习中了,在这里你们可以学到项目是怎么被我们一步步写出来。让我们为之加油吧!!!!
本期讲解:
1.了解Maven,并配置国内源
2.了解SpringBoot基础知识
前言
深入理解 Maven:Java 开发者必备的项目管理神器
在 Java 生态系统中,Maven 是每个开发者都绕不开的核心工具。它不仅是一个构建工具,更是现代软件开发中项目管理、依赖协调和团队协作的基石。无论是管理小型个人项目,还是协调大型企业级应用,Maven 都以其标准化的流程和强大的生态体系,为开发者节省了大量时间与精力。
为什么需要 Maven?
传统的 Java 项目开发中,开发者往往需要手动处理以下痛点:
- 依赖地狱:手动下载、管理第三方库版本冲突
- 构建流程繁琐:编译、测试、打包等步骤重复编写脚本
- 环境不一致:不同开发者本地配置差异导致的部署问题
- 协作效率低:项目结构不统一,新人上手成本高
Maven 通过标准化项目结构、自动化依赖管理和生命周期管理,将这些问题转化为简单的配置文件操作。只需一个pom.xml
文件,就能定义项目的所有元数据、依赖关系和构建规则,实现 "一次配置,到处运行"。
本文将带您解锁 Maven 的核心能力:
- 基础篇:从 POM 文件的基本结构到仓库管理
- 实战篇:掌握常用生命周期命令与插件扩展
- 进阶篇:多模块项目管理与私服搭建
- 最佳实践:依赖范围控制、版本策略与持续集成集成
无论您是刚入门的开发者,还是想进一步优化现有项目的技术负责人,都能在本文中找到提升开发效率的关键技巧。让我们从 Maven 的起源开始,逐步揭开这个强大工具的神秘面纱。
一. Maven 概述(适合初学者)
1. 什么是 Maven?
Maven 是一个 项目构建管理工具,主要用于 Java 项目的管理。它能够自动化处理以下任务:
-
编译:把 Java 源代码转换成字节码(
.class
文件)。 -
测试:运行 JUnit 等测试框架进行自动化测试。
-
打包:将编译后的代码打包成 JAR 或 WAR 文件。
-
依赖管理:自动下载并管理第三方库(如 Spring、Hibernate)。
-
部署:将打包好的文件发布到服务器或仓库。
官方对于Maven的描述:
ApacheMavenisasoftwareprojectmanagementandcomprehensiontool. Basedonthe concept of aproject object model (POM), Mavencanmanageaproject'sbuild,reporting and documentation fromacentral piece of information
引⽤来⾃ :Welcome to Apache Maven – Mavenhttps://maven.apache.org/index.html
👉 简单来说,Maven 就是一个帮你 管理项目、自动化构建、管理依赖 的工具,让你不用手动配置各种复杂的编译、打包、测试等流程。通过pom.xml⽂件的配置获取jar包,⽽不⽤⼿动去添加jar包
2.为什么要学习 Maven? 🚀
在 Java 开发中,Maven 是一款 强大且广泛使用的项目管理与构建工具。它不仅可以帮助开发者 自动化构建,还提供 依赖管理、项目打包、测试、部署 等功能。
如果你在开发 Java 应用,特别是 Spring Boot、微服务、大型企业级项目,Maven 是一项 必备技能!
2.1 Maven 的特点
✅2.1 依赖管理(Dependency Management) 🔄
在 Java 项目中,我们通常需要 引入第三方库(如 Spring、Hibernate、MyBatis 等),传统方式是:
-
手动下载 JAR 包,然后添加到
lib
目录 -
手动管理 JAR 版本,避免冲突
👉 使用 Maven 之后,只需在 pom.xml
中声明依赖,它就能自动下载、更新、管理 JAR 包!
示例:引入 Spring Boot 依赖
✅ Maven 会自动从 中央仓库 下载 JAR,并放入本地仓库,无需手动管理!
✅2.2 统一的项目结构 📂
Maven 规定了 标准的目录结构,不同项目遵循相同的规范,便于团队协作。
默认目录结构:
✅ 这种规范化的目录结构,让项目组织更加清晰,团队协作更高效!
✅2.3 一键构建(Build Automation) ⚙️
在传统开发中,我们可能需要手动执行多个步骤:编译、测试、打包、部署。
Maven 提供 生命周期管理,只需一条命令,即可完成所有步骤:
mvn clean package
等同于执行以下步骤:
-
clean:清理项目
-
compile:编译源码
-
test:执行单元测试
-
package:打包成 JAR/WAR
-
install:安装到本地仓库
-
deploy:发布到远程仓库
✅ 自动完成 清理、编译、测试、打包,极大提升开发效率!
✅2.4 插件机制(Plugins) 🔌
Maven 采用 插件式架构,所有功能(如编译、测试、打包、部署)都由插件提供。
例如,打包 Spring Boot 项目:
mvn spring-boot:run
✅ 插件扩展性强,可根据项目需求添加各种插件(如 Docker、代码格式化、代码检查等)。
✅2.5支持多模块项目(Multi-Module Projects) 🏗️
Maven 支持在 一个父项目(Parent Project) 下管理多个子模块(Module),适用于大型项目。
示例:
parent-project/
│── pom.xml # 父模块
│── module-a/ # 子模块 A
│── module-b/ # 子模块 B
✅ 适用于微服务架构,多个模块可以共享依赖,避免重复管理!
2.2 Maven 的优势
✅ 2.1 依赖管理自动化,解决 JAR 包冲突
Maven 可以自动下载、更新、管理 JAR 依赖,解决 JAR 版本冲突(Dependency Hell)。
示例: 假设 A 依赖
spring-core 5.3.0
,B 依赖spring-core 5.2.0
,Maven 会根据 版本解析策略 自动选择合适的版本。
✅ 2.2 一键构建,减少繁琐操作
传统项目需要手动编译、打包、测试,而 Maven 只需一条命令即可完成:
mvn clean package
✅ 节省时间,提高效率!
✅ 2.3 统一开发标准,提高团队协作
-
Maven 提供 标准化项目结构,不同团队成员可以 快速理解项目。
-
统一的
pom.xml
依赖管理,避免“每个人的 JAR 版本不一样”的情况。
✅ 在企业级项目中,Maven 让团队协作更顺畅!
✅ 2.4 适用于企业级项目与 CI/CD 集成
Maven 可以与 Jenkins、GitLab CI/CD、Docker、Kubernetes 结合,实现 自动化构建与部署。
例如,使用 Jenkins 触发 Maven 构建:
mvn clean install
✅ 企业级项目离不开 Maven,它是 DevOps 的重要组成部分!
✅ 2.5 丰富的生态系统
Maven 依赖的 JAR 包存储在 Maven 中央仓库,你可以直接引用 Spring、Hibernate、MyBatis、Redis、Kafka 等上千种开源库,无需手动下载。
✅ 拥有海量开源库,开发更加高效!
✅2.6 适用于大型企业级项目 🏢
-
支持 多模块项目(子项目管理)
-
便于 CI/CD 集成(如 Jenkins、GitLab CI)
-
与 Spring Boot、Spring Cloud 等框架深度集成
✅ 目前,90% 以上的 Java 企业级项目 都在使用 Maven!
✅2.7 与 Gradle、Ant 对比 🆚
✅ 结论:Maven 适用于 大多数 Java 开发场景,Gradle 在 Android 和大型微服务项目 更受欢迎。
2.3 创建⼀个Maven项⽬
IDEA本⾝已经集成了Maven,我们可以直接使⽤,⽆需安装
以 下截图的idea版本为: 2024.3.1.1,不同版本的idea界⾯展⽰会有所不同
File-> New->Project
点击下一步(next),就创建好了⼀个Maven项⽬
2.4 Maven核⼼功能
接下来,我们结合项⽬,介绍Maven在项⽬开发中的作⽤.
主要体现在两个⽅⾯: 1. 项⽬构建 2. 管理依赖
✅2.4.1 项⽬构建
Maven提供了标准的,跨平台(Linux,Windows,MacOS等)的⾃动化项⽬构建⽅式
当我们开发了⼀个项⽬之后,代码需要经过编译,测试,打包,发布等流程,每次代码的修改,都需要经过 这些流程,如果代码反复调试修改,这个流程就需要反复进⾏,就显得特别⿇烦,,⽽Maven给我们提供了 ⼀套简单的命令来完成项⽬的构建
⽐如,点击package,就可以完成项⽬的打包操作
打包就是把所有的class⽂件,全部放在⼀起,打成jar包或者war包
jar包和war包都是⼀种压缩⽂件 jar包就是把开发⼈员已经写好的⼀些代码进⾏打包. 打好的jar包就可以引⼊到其他项⽬中,也可以直 接使⽤这些jar包中的类和属性.另外也可以打成可执⾏jar包,这样的包就可以通过java-jar命令来执 ⾏
war包可以理解为是⼀个web项⽬,⾥⾯是项⽬的所有东西,通常⽤于⽹站
✅2.4.2 依赖管理
上⾯说到:
,Maven是⼀个项⽬管理⼯具,通过pom.xml⽂件的配置获取jar包,⽽不⽤⼿动去添加jar包
获取的jar包,其实就是依赖. pom.xml 依赖配置 就是maven的配置⽂件,⽤以描述项⽬的各种信息
依赖:指当前项⽬运⾏所需要的jar包.:
⽐如前⾯学习JDBC时,我们需要⼿动下载mysql-connector-java的包.并且添加到项⽬中
如果使⽤Maven,我们只需要在pom.xml中引⼊mysql-connector-java的依赖就可以了
1 <dependency>
2 <--里面放置项目的依赖坐标,可以分为多个-->
3 </dependency>
1. 在pom⽂件 <dependency> 标签内,添加依赖坐标
2. 点击刷新按钮,引⼊新加⼊的依赖jar包
后续有添加新的jar包,或者修改jar包版本,都需要通过该⽅式在项⽬中添加依赖.
3. 刷新完之后,就可以在项⽬中看到新加⼊的jar包
✅2.4.3 依赖传递
在 Java 开发中,我们的项目往往需要引入多个第三方库,而这些库本身可能也依赖于其他库。Maven 通过依赖传递机制(Transitive Dependency),自动解析和下载所有 直接依赖 和 间接依赖,极大地简化了依赖管理。
2.4.3.1. 依赖的分类
在 Maven 中,依赖可以分为两种:
-
直接依赖(Direct Dependency):开发者在
pom.xml
中手动添加的依赖。 -
间接依赖(Transitive Dependency):某个直接依赖的 JAR 本身依赖 其他 JAR,它们被 Maven 自动引入,无需手动添加。
<dependencies>
<!-- 直接依赖 Spring Web -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<version>2.7.3</version>
</dependency>
</dependencies>
✅ Spring Boot Web Starter 本身依赖于 spring-web
、tomcat
、jackson
等多个库,Maven 会自动下载这些依赖,无需手动添加!
2.4.3.2. 依赖传递的规则
Maven 依赖传递的核心规则如下:
📌 规则 1:最短路径优先
当一个 JAR 通过不同的路径被多次引入时,Maven 选择路径最短的版本。
示例:
A(你的项目) 依赖 B(1.0)
B(1.0) 依赖 C(2.0)
A 依赖 D(1.0)
D(1.0) 依赖 C(1.5)
-
C
通过B
传递的路径是A → B → C (2.0)
-
C
通过D
传递的路径是A → D → C (1.5)
✅ 最终选择 C (2.0)
,因为 A → B → C
的路径更短。
📌 规则 2:最近定义优先
如果同一个依赖在 pom.xml
中直接定义,并且版本不同,Maven 会优先使用直接声明的版本,即 "谁近用谁"。
示例:
<dependencies>
<!-- 直接引入 jackson-databind 2.12.3 -->
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.12.3</version>
</dependency><!-- Spring Boot Starter 依赖 jackson-databind 2.11.0 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<version>2.7.3</version>
</dependency>
</dependencies>
✅ Maven 会使用 jackson-databind 2.12.3
,因为它在 pom.xml
直接声明了版本。
📌 规则 3:依赖范围(Scope)影响依赖传递
不同的 scope
(作用域)会影响 Maven 依赖的传递方式:
示例:避免传递不必要的依赖
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>servlet-api</artifactId>
<version>4.0.1</version>
<scope>provided</scope> <!-- 由 Tomcat 提供,不需要打包 -->
</dependency>
✅ provided
作用域的依赖不会被传递给其他模块,避免 JAR 冲突。
2.3.4.3. 如何查看依赖传递关系?
方法 1:使用 mvn dependency:tree
mvn dependency:tree
📌 示例输出:
[INFO] +- org.springframework.boot:spring-boot-starter-web:jar:2.7.3:compile
[INFO] | +- org.springframework.boot:spring-boot-starter:jar:2.7.3:compile
[INFO] | | +- org.springframework.boot:spring-boot:jar:2.7.3:compile
[INFO] | | +- org.springframework.boot:spring-boot-autoconfigure:jar:2.7.3:compile
[INFO] | +- org.springframework:spring-web:jar:5.3.21:compile
[INFO] | +- com.fasterxml.jackson.core:jackson-databind:jar:2.13.3:compile
✅ 可以清楚地看到每个 JAR 的依赖关系!
方法 2:使用 mvn dependency:resolve
mvn dependency:resolve
📌 作用:列出所有解析后的依赖,显示最终使用的版本。
2.3.4.4. 依赖冲突的解决方案
🛠️ 方案 1:手动指定版本
如果某个依赖版本冲突,可以手动在 pom.xml
中指定正确的版本:
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.13.3</version>
</dependency>
🛠️ 方案 2:使用 <dependencyManagement>
统一管理版本
在 父项目(Parent) 中,使用 <dependencyManagement>
统一指定依赖的版本:
<dependencyManagement>
<dependencies>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.13.3</version>
</dependency>
</dependencies>
</dependencyManagement>
✅ 这样子模块(Submodule)就不会引入错误版本的 jackson-databind
!
🛠️ 方案 3:使用 exclusions
排除某些依赖
如果某个库带来的 间接依赖 版本不对,可以在 pom.xml
里排除它:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<version>2.7.3</version>
<exclusions>
<exclusion>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
</exclusion>
</exclusions>
</dependency>
✅ 这样 spring-boot-starter-web
就不会自动引入 jackson-databind
,避免版本冲突。
2.5 Maven Help插件
当项⽬⽐较复杂时,我们就会有Jar包冲突的问题,这时候就需要去解决依赖冲突.解决冲突之前,需要先 找到冲突,我们可以使⽤MavenHelp插件来观察包和包之间的依赖关系.
理解"插件"(plugin) 天⽕+擎天柱=>会⻜的擎天柱. 天⽕在牺牲之前把⾃⼰变成了擎天柱的"⻜⾏插件".在擎天柱需要起⻜的时候就变成翅膀装在擎天柱 ⾝上.不需要起⻜的时候就卸下来放到擎天柱的集装箱⾥. 程序开发的时候也经常如此. 像IDEA这样的程序虽然功能强⼤,但是也⽆法⾯⾯俱到.对于⼀些特殊场景的功能,开发者就可以开 发⼀些"插件".如果需要这个插件,就单独安装. 插件就是对程序的⼀些特定场景,做出⼀些特定的功能的扩展.
安装插件:File->Settings->Plugins->搜索'MavenHelp'-> 找到对应插件,点击Install安装即可,安装 后需要重启下idea,才能⽣效
安装之后,打开pom⽂件,可以看到Jar包之间的依赖关系
也可以右键排除掉⼀些依赖
2.6 Maven仓库
我们通过短短⼏⾏代码,就把依赖jar包放在了项⽬⾥,具体是如何做的呢?
这个代码,我们称之为"坐标",也就是唯⼀的.
在Maven中,根据groupId、artifactId、version的配置,来唯⼀识别⼀个jar包,缺⼀不可.
当我们在pom⽂件中配置完依赖之后,点击刷新,Maven会根据坐标的配置,去仓库⾥寻找Jar包,并把他 下载下来,添加到项⽬中.这个Jar包下载的地⽅就称为仓库.
Maven仓库的本质就是⼀个⽬录(⽂件夹),这个⽬录被⽤来存储开发中所有依赖(jar包,插件等).
Central Repository: springframework
Maven仓库分为两⼤类:本地仓库和远程仓库.其中远程仓库⼜分为中央仓库,私服和其他公共库
✅2.6.1 本地仓库
本地仓库:⾃⼰计算机上的⼀个⽬录(⽤来存储jar包)
当项⽬中引⼊对应依赖jar包后,⾸先会查找本地仓库中是否有对应的jar包
• 如果有,则在项⽬直接引⽤
• 如果没有,则去中央仓库中下载对应的jar包到本地仓库
本地仓库地址可以通过Maven配置查看:
查看该仓库⽬录,可以看到该⽬录下有很多的jar(最开始是空的,随着Maven的使⽤,该仓库下⽂件会越 来越多)
✅2.6.2 中央仓库
中央仓库:maven软件中内置⼀个远程仓库地址,就是中央仓库,服务于整个互联⽹.由Maven团队 维护,全球唯⼀.
仓库地址:Central Repository:
可以通过https://mvnrepository.com/这个⽹站来查询并下载 我们可以把⾃⼰写好的Jar包上传到中央仓库(具备⼀定的要求),也可以从中央仓库下载Jar包
查找Jar的坐标
1. 访问https://mvnrepository.com/
2. 进⾏查找,⽐如mysql
3. 选择要添加的Jar包版本
4. 查看Jar包对应坐标
✅2.6.3 私有服务器,也称为私服
私服:⼀般由公司团队搭建的私有仓库.
私服属于某个公司,或者某个部⻔,往往需要⼀定权限.
有了私服之后,Maven依赖下载的顺序⼜发⽣了变化
当Maven需要下载资源的时候
1. 先从本地仓库获取,本地仓库存在,则直接返回
2. 如果本地仓库没有,就从私服请求,私服存在该资源,就直接返回
3. 如果私服上不存在该资源,则从中央仓库下载,中央仓库不存在,就报错了...
4. 如果中央仓库中存在,就先缓存在私服上之后,再缓存到本地仓库⾥,再为Maven的下载请求提供服务
私服是很多⼈在使⽤的,所以只需要第⼀个使⽤者下载⼀次就可以了
2.7 Maven设置国内源
因为中央仓库在国外,所以下载起来会⽐较慢,所以咱们选择借助国内⼀些公开的远程仓库来下载资源 接下来介绍,如何设置国内源
✅2.7.1 配置当前项⽬
setting File->Settings
1. 查看配置⽂件的地址,如上图所⽰,Maven配置⽂件地址为:D:\Maven\.m2\settings.xml
不同电脑设置的Maven路径不同
settings和repository可以修改设置为其他路径,两个路径不要有中⽂
2. 配置国内源
Maven仓库默认在国外https://mvnrepository.com/,国内使⽤时会⽐较慢,我们可以更换为阿⾥云 的仓库
也可以选择别的仓库,参考:https://zhuanlan.zhihu.com/p/627320558
打开settings.xml,在mirrors节点上,添加内容如下:
✅2.7.2 设置新项⽬的setting
上述配置的内容,只对当前项⽬⽣效,为了让后续新建的项⽬也⽣效,需要重新设置⼀下新项⽬的 Settings
当前项⽬和新项⽬共⽤⼀个setttings⽂件即可,所以新项⽬的设置,只需要确认⼀下settings⽂件的路 径即可.
结语:以 Maven 为舟,驶向高效开发的蓝海
在 Java 开发的漫漫征途中,Maven 早已超越了工具的范畴,成为现代软件工程思想的载体。它通过标准化的项目结构降低协作成本,用自动化流程解放开发者的双手,借生态化的插件体系连接整个技术栈 —— 这正是其历经二十余年仍保持旺盛生命力的核心原因。
当您掌握了 Maven 的核心原理,会发现它不仅能构建项目,更能构建团队的开发范式。从单模块到多模块架构,从本地开发到 CI/CD 流水线,从中央仓库到私有镜像,Maven 始终扮演着技术枢纽的角色。在微服务和云原生时代,其声明式配置思想更与 Docker、Kubernetes 等工具形成完美互补。
技术的进步永无止境,Maven 也在持续进化。从pom.xml
到settings.xml
,从生命周期到插件机制,每个细节都值得反复推敲。建议读者在实践中不断探索:尝试自定义插件封装企业级规范,研究依赖传递算法优化构建速度,或是结合 Spring Boot 等框架实现 "零配置" 开发体验。
最后,愿每位开发者都能以 Maven 为舟,在代码的海洋中乘风破浪。记住,真正的高效开发,始于对工具的深刻理解,成于对流程的极致优化。
相关文章:
Maven快速上手
在前面我们学习了许多关于JAVA的知识,从今天这个博客开始我们就要进入到JAVAEE进阶的学习中了,在这里你们可以学到项目是怎么被我们一步步写出来。让我们为之加油吧!!!! 本期讲解: 1.了解Maven…...
【Django】教程-5-ModelForm增删改查+规则校验【正则+钩子函数】
【Django】教程-1-安装创建项目目录结构介绍 【Django】教程-2-前端-目录结构介绍 【Django】教程-3-数据库相关介绍 【Django】教程-4-一个增删改查的Demo 11. ModelForm 11.1 models.py from django.utils import timezone from django.db import models# 数据库ÿ…...
JavaScript中 == 和 === 区别
== 运算符 它是相等运算符,用于比较两个 值 是否相等 ( 如果两个值的类型不同,它会尝试将它们转换为相同的类型,然后再比较。) 示例: console.log(1 == 1); // true,因为1被转换为数字1,所以相等 console.log(1 == true); // true,因为true被转换为数字1,所以相等…...
使用LangChain Agents构建Gradio及Gradio Tools(3)——使用Langchain agents构建Gradio UI
使用LangChain Agents构建Gradio及Gradio Tools(3)——使用Langchain agents构建Gradio UI 本篇摘要16. 使用LangChain Agents构建Gradio及Gradio Tool16.3 使用Langchain agents构建Gradio UI16.3.1 创建代理16.3.2 创建Gradio UI16.3.3 运行demo参考文献本章目录如下: 《使…...
scikit-surprise 智能推荐模块使用说明
目录 1、前言 2、算法 3、数据集 3.1 three built-in datasets are available: 3.2 Load a dataset from a pandas dataframe. 3.3 Load a dataset from a (custom) file. 3.4 Load a dataset where folds (for cross-validation) are predefined by some files. 4、pre…...
基于python开发的邮箱合并群发工具
智能邮件群发系统 一个基于Python和PyQt5开发的智能邮件群发工具,支持Word模板和Excel数据源的自动匹配,具有现代化UI界面和友好的用户体验。 Github项目地址:https://github.com/liugang926/Auto-mail-sent.git dist目录有编译好的exe程序&…...
分治算法之凸包问题
1. 算法思路 基本思想 利用分治策略解决凸包问题主要分为两大步骤: 分解(Divide): 将所有点按照 x 坐标排序,并将点集分为左右两部分。 递归地对左右两部分分别求解凸包。 合并(Conquer/Merge…...
OpenBMC:BmcWeb 处理http请求3 字典树查找节点
OpenBMC:BmcWeb 处理http请求2 查找路由对象-CSDN博客 findRouteByPerMethod实际上是调用了perMethod.trie.find(url);来查找路由对象的 class Trie {struct FindResult{unsigned ruleIndex;std::vector<std::string> params;};FindResult findHelper(const std::string…...
音频进阶学习二十五——脉冲响应不变法实现低通滤波器
文章目录 前言一、脉冲响应不变法1.定义2.模拟系统冲激响应的周期采样3.模拟系统和数字系统的频域响应关系1)S域和Z域的关系2)幅频响应的关系 4.通过有理函数设计滤波器5.总结 二、低通滤波器的设计实例1.给定数字滤波器指标2.转换模拟滤波器指标3.模拟滤…...
Linux中输入输出管理技巧
一、输入输出使用到的系统资源 1、字符设备(Character Devices) 什么是字符设备 字符设备是 Linux 中的一类设备,支持以字符为单位进行数据传输。与块设备不同,字符设备不需要缓 冲区,即数据是逐字节直接传递的。典…...
wireshark抓包工具的使用
下载地址:https://www.wireshark.org/#downloadLink 安装方式,一路next。 使用方式 第一步启动后选择你要抓包的网卡,ipconfig 可以查看你的默认网卡,我的是 以太网 双击进入。 筛选操作(快速筛选方式)…...
javaweb自用笔记:文件上传案例、登录(统一拦截)案例
文件上传 或者说新建一个类配置好信息,然后到aliOssUtils里面用getter、setter方法获取到配置项 登录(统一拦截) 前端要json格式的数据,捕获到异常后前端可以显示错误(对不起,操作失败,请联系管…...
【区块链安全 | 第十七篇】类型之引用类型(一)
文章目录 引用类型数据存储位置分配行为 数组特殊数组:bytes 和 string 类型bytes.concat 和 string.concat 的功能分配 memory 数组数组字面量(Array Literals)二维数组字面量数组成员(Array Members)悬空引用&#x…...
2025国内DevOps新手突围指南:从Gitee零门槛入门到工具链深度对比
对于刚接触DevOps的新手,推荐优先选择Gitee DevOps平台,其次是Jenkins和GitLab。Gitee DevOps作为国内领先的一站式研发效能平台,深度融合代码托管、持续集成/持续交付(CI/CD)、项目协作等功能,不仅界面简洁…...
【C语言】文件操作(2)
一、文件的随机读写 在前面我们学习了文件的顺序读写的函数,那么当我们要读取某个指定位置的内容的时候,是否只能顺序的读取到这个内容?还有在对文件进行输入的时候,需要对指定的位置进行写入,那么此时应该怎么办呢&a…...
将内网的IP地址映射到外网的几种方案
文章目录 1. 背景与目标2. 核心方案选型3. 方案A:路由器端口映射(详细步骤)3.1 前置条件3.2 配置流程3.3 验证访问 4. 方案B:云平台NAT网关配置(以阿里云为例)4.1 前置条件4.2 配置流程4.3 验证访问 5. 方案…...
基于深度学习的图像超分辨率技术研究与实现
一、引言 在数字图像处理领域,图像超分辨率技术一直是一个备受关注的热点话题。随着人们对图像质量要求的不断提高,如何将低分辨率图像提升到高分辨率,同时保持图像的细节和清晰度,成为了一个极具挑战性的问题。传统的图像超分辨率技术主要依赖于插值方法,如双线性插值、双…...
A股复权计算_权息数据整理
目录 前置: 步骤: 1 以通达信为参照 2 从优矿获取所需数据 2.1 股票配股信息 2.2 股票分红信息 2.3 股票拆股信息 3 合并数据,制成权息数据表 权息数据截止20250329.7z 视频 前置: 1 本系列将以 “A股复权计算_” 开头…...
如何进行Prompt调优?
一. 神奇的咒语 在输入prompt前,加入下面这一段“神奇的咒语”,中文或者英文,就能帮你优化提示词。 I want you to become my Expert Prompt Creator. Your goal is to help me craft the best possible prompt for my needs. The prompt yo…...
Git Tag 详解:版本管理与实战指南
文章目录 Git Tag 详解:版本管理与实战指南1. Git Tag 的类型2. Git Tag 的常见操作(1) 创建标签① 创建轻量标签② 创建附注标签③ 给指定的提交打标签 (2) 查看标签(3) 删除标签(4) 推送标签到远程① 推送单个标签② 推送所有标签 (5) 删除远程标签 3. 使用 Tag 的…...
从零开始打造HTML5拼图游戏:一个Canvas实战项目
从零开始打造HTML5拼图游戏:一个Canvas实战项目 先看效果: 你是否曾经被那些精美的网页拼图游戏所吸引?用 HTML5 的 Canvas 技术,从零开始,教你怎么画图、处理鼠标事件,还有游戏的核心逻辑,…...
【数据分享】2000—2024年我国乡镇的逐年归一化植被指数(NDVI)数据(年最大值/Shp/Excel格式)
之前我们分享过2000-2024年我国逐年的归一化植被指数(NDVI)栅格数据,该逐年数据是取的当年月归一化植被指数(NDVI)的年最大值!另外,我们基于此年度栅格数据按照行政区划取平均值,得到…...
设计模式 Day 2:工厂方法模式(Factory Method Pattern)详解
继 Day 1 学习了单例模式之后,今天我们继续深入对象创建型设计模式——工厂方法模式(Factory Method)。工厂方法模式为对象创建提供了更大的灵活性和扩展性,是实际开发中使用频率极高的一种设计模式。 一方面,我们将简…...
TensorFlow SegFormer 实战训练代码解析
一、SegFormer 实战训练代码解析 SegFormer 是一个轻量级、高效的语义分割模型,结合了 ViT(视觉 Transformer) 和 CNN 的高效特征提取能力,适用于边缘 AI 设备(如 Jetson Orin)。下面,我们深入…...
51c嵌入式~单片机~合集7~※
我自己的原文哦~ https://blog.51cto.com/whaosoft/13692314 一、芯片工作的心脏--晶振 在振荡器中采用一个特殊的元件——石英晶体,它可以产生频率高度稳定的交流信号,这种采用石英晶体的振荡器称为晶体振荡器,简称晶振。 制作方法 …...
私有知识库 Coco AI 实战(一):Linux 平台部署
Coco AI 是一个完全开源、跨平台的统一搜索和生产力工具,能够连接各种数据源,包括应用程序、文件、Google Drive、Notion、Yuque、Hugo 等,帮助用户快速智能地访问他们的信息。通过集成 DeepSeek 等大型模型,Coco AI 实现了智能个…...
大模型高质量rag构建:A Cheat Sheet and Some Recipes For Building Advanced RAG
原文:A Cheat Sheet and Some Recipes For Building Advanced RAG — LlamaIndex - Build Knowledge Assistants over your Enterprise DataLlamaIndex is a simple, flexible framework for building knowledge assistants using LLMs connected to your enterpris…...
LeetCode 78.子集
问题描述 给定一个不含重复元素的整数数组 nums,返回其所有可能的子集(幂集)。 示例 输入: nums [1,2,3] 输出: [ [], [1], [1,2], [1,2,3], [1,3], [2], [2,3], [3] ]解法:回溯算法 回溯是一种 暴力…...
变量(Variable)
免责声明 如有异议请在评论区友好交流,或者私信 内容纯属个人见解,仅供学习参考 如若从事非法行业请勿食用 如有雷同纯属巧合 版权问题请直接联系本人进行删改 前言 提示:从小学解方程变量x,到中学阶段函数自变量x因变量y&…...
【STM32】最后一刷-江科大Flash闪存-学习笔记
FLASH简介 STM32F1系列的FLASH包含程序存储器、系统存储器和选项字节三个部分,通过闪存存储器接口(外设)可以对程序存储器和选项字节进行擦除和编程,(系统存储器用于存储原厂写入的BootLoader程序,用于串口…...
Dify 深度集成 MCP实现灾害应急响应
一、架构设计 1.1 分层架构 #mermaid-svg-5dVNjmixTX17cCfg {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-5dVNjmixTX17cCfg .error-icon{fill:#552222;}#mermaid-svg-5dVNjmixTX17cCfg .error-text{fill:#552222…...
2025 年上半年软考信息系统项目管理师备考计划
2025 年上半年软考信息系统项目管理师备考计划 2025 年上半年软考信息系统项目管理师考试时间为 5 月 24 日 - 27 日,从现在开始备考,需合理规划,高效学习。以下为详细备考计划: 一、基础学习阶段(现在 - 4 月上…...
Scikit-learn使用指南
1. Scikit-learn 简介 定义: Scikit-learn(简称 sklearn)是基于 Python 的开源机器学习库,提供了一系列算法和工具,用于数据挖掘、数据预处理、分类、回归、聚类、模型评估等任务。特点: 基于 NumPy、SciP…...
学习大模型需要具备哪些技术、知识和基础
数学基础 概率论与数理统计:用于理解模型中的不确定性、概率分布,以及进行数据的统计分析、评估模型的性能等。例如,通过概率分布来描述模型预测结果的可信度,利用统计方法对数据进行抽样、估计模型的参数等。线性代数࿱…...
十五届蓝桥杯省赛Java B组(持续更新..)
目录 十五届蓝桥杯省赛Java B组第一题:报数第二题:类斐波那契数第三题:分布式队列第四题:食堂第五题:最优分组第六题:星际旅行第七题:LITS游戏第八题:拼十字 十五届蓝桥杯省赛Java B…...
Flink SQL Client bug ---datagen connector
原始sql语句如下 CREATE TABLE test_source (event_time TIMESTAMP(3), -- 事件时间(精确到毫秒)click INT, -- 随机数值字段WATERMARK FOR event_time AS event_time - INTERVAL 5 SECOND WITH (connector datagen, …...
股指期货的多头套期保值是什么意思?
多头套期保值,又叫“买入套期保值”,听起来很复杂,其实很简单。它的核心就是“提前锁定价格,防止未来价格上涨”。 举个例子,假设你是一家工厂的老板,过几个月要买一批原材料。现在原材料的价格是100元/吨…...
hadoop集群配置-scp命令
scp 命令用于在不同主机之间复制文件或目录,在Hadoop集群配置中常用于将配置文件或相关资源分发到各个节点。以下是 scp 命令的基本用法和在Hadoop集群配置中的示例: 基本语法 scp [-r] [源文件或目录] [目标用户目标主机:目标路径] - -r :…...
Redis 源码硬核解析系列专题 - 结语:从源码看Redis的设计哲学
1. 引言 通过前七篇的源码解析,我们从Redis的整体架构、核心数据结构、事件驱动模型,到内存管理、持久化、主从复制与集群模式,逐步揭开了Redis高性能与简洁性的秘密。本篇将总结这些技术细节,提炼Redis的设计哲学,并探讨如何将源码学习成果应用到实际开发中。 2. Redis的…...
解决QSharedPointer栈变量的崩溃问题
目录 参考崩溃代码现象 解决 参考 QSharedPointer的陷阱 qt中的共享指针,QSharedPointer类 崩溃 代码 #include <QtCore/QCoreApplication> #include <QDebug> #include <QSharedPointer>class MyClass { public:void doSomething() {qDebug…...
Lambda 表达式是什么以及如何使用
目录 📌 Kotlin 的 Lambda 表达式详解 🎯 什么是 Lambda 表达式? 🔥 1. Lambda 表达式的基本语法 ✅ 示例 1:Lambda 基本写法 ✅ 示例 2:使用 it 关键字(单参数简化) ✅ 示例 3…...
C++自定义迭代器
实现自己的迭代器 最近在写数据结构,使用类模板实现,碰到了一些问题,其中有一个就是遍历的问题,查阅资料最后实现了自己的迭代器,让我实现的数据结构能像STL一样进行for循环遍历。 类的构成 #include <stdexcept…...
PWA 中的 Service Worker:如何实现应用离线功能
前言 在当今快速发展的互联网时代,Progressive Web App (PWA) 正在逐步成为现代 Web 开发的主流选择。PWA 将 Web 应用和原生应用的最佳特性相结合,提供了丰富的用户体验。而在 PWA 的众多技术中,Service Worker 无疑是其核心组件之一。 作…...
dockerfile制作镜像
1.docker pull centos:centos7 2.dockerfile内容 FROM centos:centos7 #指定镜像维护的作者和邮箱 MAINTAINER csdn< **********qq.com #设置环境变量mypath ENV MYPATH /usr/local #设置进入容器的默认目录是/usr/local WORKDIR $MYPATH # 下载并替换 CentOS 镜像源 RUN …...
网络空间安全(46)DevSecOps概述
一、定义与核心理念 DevSecOps是“开发(Development)、安全(Security)和运营(Operations)”的结合,它将安全实践融入软件开发生命周期的每个阶段,从需求、设计、开发、测试到部署和运…...
LeetCode 211
实现支持通配符的字典树(Trie):解决单词匹配问题 一、问题描述 我们需要设计一个数据结构,支持以下功能: 添加新单词搜索字符串是否与任何已添加的单词匹配,其中搜索字符串可能包含通配符 .(…...
Docker Compose 启动jar包项目
参考文章安装Docker和Docker Compose 点击跳转 配置 创建一个文件夹存放项目例如mydata mkdir /mydata上传jar包 假设我的jar包名称为goudan.jar 编写dockerfile文件 vim app-dockerfile按键盘上的i进行编辑 # 使用jdk8 FROM openjdk:8-jre# 设置时区 上海 ENV TZAsia/Sh…...
利用deepseek直接调用其他文生图网站生成图片
这次deepseek输入中文后,其实翻译英文后,是可以丢到比如pollinations.这个网站,来生成图片,用法如下: 你是一个图像生成助手,请根据我的简单描述,想象并详细描述一幅完整的画面。 然后将你的详…...
远程装个Jupyter-AI协作笔记本,Jupyter容器镜像版本怎么选?安装部署教程
通过Docker下载Jupyter镜像部署,输入jupyter会发现 有几个版本,不知道怎么选?这几个版本有什么差别? 常见版本有: jupyter/base-notebookjupyter/minimal-notebookjupyter/scipy-notebookjupyter/datascience-notebo…...
11. 盛最多水的容器
leetcode Hot 100系列 文章目录 一、核心操作二、外层配合操作三、核心模式代码总结 一、核心操作 最左右两边逐步往中间走,每次在左右中选取小的一个或–记录最大面积 提示:小白个人理解,如有错误敬请谅解! 二、外层配合操作…...