Java:JPMS模块化开发
JPMS(Java Platform Module System)简介
为什么用JPMS?
JPMS(Java 平台模块系统)是 Java 9 引入的模块化系统,也称为 Jigsaw 项目。它为 Java 提供了更精细的模块化机制,用于组织和管理代码,以解决 JAR 包管理的复杂性和依赖问题。
JAR包的问题
JAR包是早期Java组件化开发的核心构件,关于jar包的具体使用,不妨看看我的这篇文章Java:JAR包的创建、导入与运行-CSDN博客
在Java程序运行时,JVM会从JAR包中抽取所有类构成一张 “大表”,然后在这张大表中按顺序查找特定的类型。
因为一个类会从类路径中第一个包含它的JAR中加载,所以这 个类会导致所有其他同名类不可用,这被称为覆盖
由于在类路径扫描中只有第一个搜索到的实例(它覆盖了所有 其他实例)会被加载,所以JAR文件的扫描顺序决定了哪些代 码会被执行。
这就导致了当两个类库分别依赖第三方类库的两 个不兼容版本时,就会发生版本冲突。 可能会导致加载意料之外的版本,或 者是两个版本先后被混合加载。
默认情况下,诸如Maven这样的构建系 统,会选择组件树中“最近的 (closest)”的版本加载。
当类路径集合包容太多的文件夹,太多的JAR文件,管理和维护它们将变得极其复杂。
- 某个JAR依赖包缺失
- 某个JAR依赖包被多次包含,并且很可能以不同 版本的形式被多次包含
- JAR包依赖的传递性导致出现循环依赖
- 外部代码使用反射等技术访问JAR包中的非公有 类型代码,导致升级和维护困难
较差的启动性能
如果某程序在运行时依赖于某个类,JVM的“类加载器(Class Loader)”是没办法知道它来自于哪个JAR的,所以它必须对类 路径中的所有JAR都执行一次线性扫描,才能找到并加载这个类。
又比如,在程序运行时如果想知道有哪些类添加了特定的“注解 (annotation)”,就需要调用反射技术查询类路径中的所有类。
由于JVM采用了“延迟加载类型”的策略,可能需要多次扫描类路径中 的JAR包,这些都是耗时操作,所以,这也是“Java程序”启动慢、占用系统资源多的原因
为了维护JAR包之间复杂的组件依赖关系,人们先后发明了 诸如Maven和Gradle这样的构建管理 工具,自动管理一个项目所引用的Jar 包之间的依赖关系,但这些工具只能 在开发与编译期间起作用,对运行时 出现的各种情况,它们无能为力,还 是没有从根本上解决问题。
因此,需要引入模块化技术
- 启动时就能发现模块的缺失问题而立即报错,不需要等到 运行后,程序走到特定流程时才触发错误。
- 能明确地控制代码的可访问性,不希望开放的代码,外部 就无法访问。
- 由于提前知道了许多信息,因此,有可能对其进行进一步 的优化。
- 可定制运行时环境,目标计算机上不再需要安装完整版本 的JRE,节约了磁盘空间。
JPMS模块化
模块化是将单体系统切分为多个小的相对独立的子 系统的一种技术手段,每个切分出来的子系统,可以 顺畅地进一步被重构和演化为微服务
对于小的应用来说,是否采用模块化,其 实影响不大,但对于需要长期维护并且持 续演化的信息系统来说,采用模块化,会 带来明显的效益。
- 模块化开发:允许开发者将代码分割为模块,明确模块的边界。
- 依赖声明:定义模块之间的依赖关系,避免类路径冲突(“JAR Hell”)。
- 更小的运行时:支持创建自定义运行时,只包含应用程序所需的模块。
- 强封装:限制模块对其他模块内部实现的访问,提升安全性和代码维护性。
模块化和模块是不同的:
模块(module) 是包含代码的可识别Java软件构件,使用了元数据 (metadata)来描述本模块及其与其他模块之间的依赖关系。你可 以把模块看成是一组用于代码重用的包(package)。
模块化( modularization) 是指将系统分解成独立且相互连接的 模块的过程。
** JPMS 的核心特性**
- 模块名称:
- 每个模块必须具有唯一的全局名称,例如
java.base
或com.example.myapp
。
- 每个模块必须具有唯一的全局名称,例如
- 模块依赖:
- 使用
requires
语句显式声明模块间的依赖关系,避免隐藏的依赖。
- 使用
- 导出包(Exported Package):
- 模块通过
exports
语句显式声明对外暴露的包,其余包默认是不可见的。 - 解决了类访问范围过宽的问题。
- 模块通过
- 强封装:
- 模块系统通过显式定义导入和导出的内容,防止包污染,提升了代码的安全性和可维护性。
- 运行时检查:
- 在程序运行时,JPMS 会验证模块间的依赖是否正确,进一步保障系统的稳定性。
**2. JPMS 的组织方式
类和包的模块化特性
- 类的模块化特性:类是 Java 系统最基础的构件,天然具有“模块化”的特性。通过结合接口,可以实现类的灵活替换和扩展,这为“基于代码重用”的开发模式奠定了基础。
- 包(Package)分类管理:
- 随着类数量的增加,Java 提供了
package
机制,将类按职责分类。 - 包不仅在逻辑上组织类,还通过访问控制(如
public
和default
)实现类的可见性控制。
- 随着类数量的增加,Java 提供了
- JAR 包的物理封装:
- JAR(Java Archive)是 Java 项目中最基础的物理构件,可以包含多个包。
- 包与包之间的依赖关系,决定了 JAR 包之间的“依赖”关系。
构建工具与依赖管理
- Maven 和 Gradle:
- 现代构建工具(如 Maven 和 Gradle)通过配置文件(
pom.xml
或build.gradle
),解决了编译时 JAR 包依赖和版本管理问题。 - 依赖管理方式:
- 声明依赖关系(比如指定具体版本或范围)。
- 自动下载依赖及其传递性依赖。
- 局限性:
- Maven 和 Gradle 的依赖管理主要针对编译时,运行时的依赖问题(例如冲突或循环依赖)需要额外处理。
- 无法直接控制类的访问权限,容易导致包的污染。
- 现代构建工具(如 Maven 和 Gradle)通过配置文件(
模块(Module)
模块(Module)”是Java平台模块系统(JPMS)的基石。像JAR一样, 模块也是类型和资源的容器,但相比JAR,它们还具有额外的特性:
- 必须有一个名称(全局唯一)
- 必须显式声明对其他模块的依赖;
- 定义了一个由导出包(exported package)构成的 “应用 程序编程接口(API)”。
Java模块具有很强的封装性, 即使是公有类型,如果它所在 的包没有导出的话,外部是不能访问它们的。
–JAR 和 Module 的对比
特性 | JAR(Java Archive) | Module(JPMS 模块) |
---|---|---|
基本单位 | 包含多个 package ,每个 package 包含多个类。 | 同样包含多个 package ,每个 package 包含多个类。 |
依赖关系管理 | 无法直接定义 JAR 包之间的依赖关系,只能通过外部工具(如 Maven 或 Gradle)进行依赖管理。 | 模块自带一个 module-info.java 配置文件,可显式定义模块之间的依赖关系(requires )。 |
依赖检查 | 依赖关系在运行时动态解析,如果无法满足依赖,会在运行时抛出异常,问题发现较晚。 | 编译时就能进行依赖关系检查,若模块依赖无法满足,编译器会报错,问题发现更早。运行时也会再次验证依赖关系,保障安全性。 |
访问控制 | JAR 内部的 public 类对所有其他 JAR 可见,容易造成包污染,访问范围难以控制。 | 模块通过 exports 显式导出特定的包,其余包默认不可见,强封装性避免了包污染。 |
运行时依赖 | 无法检测未导入的类是否存在,运行时可能会因类不存在导致 ClassNotFoundException 。 | 模块在运行时会验证模块依赖关系,若依赖缺失或冲突,会抛出异常,确保运行时安全。 |
开发工具支持 | 构建工具(如 Maven/Gradle)负责管理依赖,但只在编译阶段有效,运行时依赖需自行处理。 | JPMS 原生支持模块化,统一管理编译时和运行时依赖,减少对第三方工具的依赖。 |
典型用途 | 传统 Java 项目和第三方库的打包与分发。 | Java 9+ 项目的模块化开发,尤其是大型应用或需要高内聚的系统。 |
- JAR 包适用于早期项目或简单的组件打包,依赖关系需要通过构建工具显式定义。
- Module是对 JAR 的扩展,具备更强的依赖管理和封装能力,适合现代化、模块化开发需求。
JPMS 的优势
- 与 JAR 包的关系:
- 模块是 JAR 包的扩展形式,具有更强的封装性和依赖控制能力。
- 与构建工具的关系:
- JPMS 与 Maven 和 Gradle 无冲突,可以共同使用。构建工具负责依赖管理,JPMS 提供模块化控制。
- 与 OSGi 的关系:
- JPMS 是 JDK 原生支持的模块化方案,使用更简单、集成更深入,适用于绝大多数场景。
3. 模块化的JDK
在JDK 9之前,Java的运行时库(Runtime Library)由一个庞大 的rt.jar所承载,其大小超过60MB,包含了Java大部分运行时类, 它们是Java平台的最终载体。
从JDK 9开始,rt.jar 被打散为多个模块。
打散后的JDK模块, 以.jmod作为文件扩展名。
模块化的JDK现在有一个jmods文件夹,里 面包容了大量的“*.jmod”文件,这其实 就是“打散”后的JDK模块。
这些jmod文件,被称为“平台模块”,它们一起构成了 JDK,整个Java软件开发与运行的平台。
在命令行中输入java --list-modules
可以列出JDK(9以上版本)的模块清单
- 以“java.”打头的模块,都是 Java SE规范的一部分。
- 以“jdk.”开头的模块包含了JDK特 定的代码,在不同的JDK实现中可能 会有所不同。
在JDK 9以上的版本中,java和 javac等原有JDK命令行工具都针对 模块进行了功能增强,添加了一些 新的命令行参数,JDK中还添加了诸 如jlink之类的新命令行工具。
平台模块间的依赖关系:
模块之间存在着“单向”依赖关系,Java模块系统不允许模块 之间存在循环依赖。
Java Base 模块 (java.base
)
- 核心模块:
java.base
是 Java 平台最核心、最基础的模块,所有其他模块都直接或间接地依赖于java.base
。 - 默认依赖:所有 Java 应用默认都依赖于
java.base
,并且无需显式声明这个依赖。因为java.base
导出了 Java 核心类库(如java.lang
、java.util
、java.io
等),所以你可以在 JDK 9 及以上版本中直接使用这些核心类,而不需要额外的配置或声明。 - 内容:
java.base
模块包含了 JDK 中的基础类库,包括常用的基础类(如String
、Object
、List
等)和 Java 基础的 IO 操作等。
Java SE 模块 (java.se
)
- 聚合器模块:
java.se
是一个 聚合器模块(aggregator module)。它并不包含具体的类实现,而是通过一组requires
语句引入了 Java SE 平台的其他模块。换句话说,java.se
模块是将其他功能模块进行逻辑分组的容器。 - 目的:通过将多个模块组合到一个聚合器模块中,
java.se
使得 Java SE 平台的模块化结构更加清晰,避免在module-info.java
文件中列出大量的requires
声明。 - 功能:它包含了构成 Java SE 平台的多个模块(如
java.base
、java.sql
、java.desktop
等),因此通过依赖java.se
,你可以方便地一次性引入所有 Java SE 标准模块,而无需显式声明每个模块的依赖。
Jmod 与 JAR 的区别
JAR(Java Archive)
- 定义:JAR 是一种文件格式,用于将 Java 类、资源文件等打包成一个单独的压缩文件。JAR 文件通常用于分发 Java 应用或库。
- 用途:JAR 文件是广泛用于 Java 项目中打包应用程序或库的标准格式。你可以将 Java 类、图像、配置文件等资源打包在一个 JAR 文件中,方便分发和部署。
- 独立性:JAR 文件是与模块化系统无关的,它不包含模块化信息,因此不支持模块化的构建与管理。
Jmod
- 定义:Jmod 是 Java 模块系统中的一种文件格式,它与 JAR 类似,但 Jmod 文件包含模块化信息,可以用于构建、分发和运行 Java 模块化应用。
- 用途:Jmod 文件通常用于构建 JDK 的模块化运行时环境。它不仅可以包含 Java 类,还包括其他文件(如配置文件、库文件等)和模块化元数据(如
module-info.class
)。 - jlink 使用:Jmod 文件并不能直接运行,它是为 jlink 工具设计的。
jlink
会根据应用程序的需要,将 Jmod 文件中使用到的模块提取出来,生成一个定制化的、精简的 Java 运行时环境(JRE)。 - 特点:
- Jmod 文件用于创建可以独立运行的“运行时环境”。
jlink
使用 Jmod 文件来构建一个包含所需模块的 JRE,而不包含无关的模块,从而生成一个体积小且精简的 JDK 环境。- Jmod 文件并不需要目标计算机上安装特定版本的 JRE,因为它包含了应用运行所需的所有模块。
特性 | JAR | Jmod |
---|---|---|
用途 | 主要用于打包 Java 应用和库 | 用于构建、分发和运行 Java 模块化应用 |
模块支持 | 不支持模块化 | 支持模块化,包含模块化元数据 |
是否可运行 | JAR 文件可以直接运行(如果包含 main 方法) | Jmod 文件不能直接运行,必须通过 jlink 生成运行时环境 |
目标 | 用于标准 Java 应用的打包和分发 | 用于构建定制的 Java 运行时环境 |
生成工具 | 使用标准的构建工具(如 Maven、Gradle)生成 | 使用 jlink 工具生成精简版 JRE |
4. 使用 JPMS 的基本步骤
module-info.java
文件**
这是 JPMS 的核心,用于声明模块。通常位于模块的根目录中。
关键语法:
module <模块名> {requires <依赖的模块名>; // 声明依赖exports <导出的包名>; // 声明对外公开的包opens <开放的包名>; // 开放包供反射使用uses <服务接口>; // 声明模块使用某服务provides <服务接口> with <实现类>; // 声明模块提供服务
}
示例:一个简单模块
假设我们有一个模块 com.example.hello
,包含以下内容:
- 包名:
com.example.hello
- 类:
HelloWorld
模块结构:
com.example.hello/
├── module-info.java
└── com/example/hello/HelloWorld.java
代码示例:
module-info.java
:
module com.example.hello {exports com.example.hello; // 对外暴露包
}
HelloWorld.java
:
package com.example.hello;public class HelloWorld {public void sayHello() {System.out.println("Hello, JPMS!");}
}
常用模块声明
-
requires
:声明模块依赖。module my.module {requires java.base; // 默认模块,无需显式声明requires java.sql; }
-
exports
:声明模块中哪些包可以被外部使用。module my.module {exports com.example.myapi; // 公开 API 包 }
-
opens
:开放包供反射使用(如给Jackson
或Hibernate
)。module my.module {opens com.example.internal; // 只开放反射访问 }
-
uses
和provides
:用于服务加载机制(SPI)。module my.module {uses com.example.Service; // 声明使用服务provides com.example.Service with com.example.impl.ServiceImpl; // 提供服务实现 }
JPMS 的核心概念
- 模块路径:
- 模块运行时位于模块路径上,而不是传统的类路径。
- 使用
--module-path
(或-p
)指定模块路径。
- 模块的强封装:
- 默认情况下,模块中的包是私有的,只有通过
exports
明确导出的包才可被外部访问。
- 默认情况下,模块中的包是私有的,只有通过
- 模块图:
- 模块之间的依赖形成一个有向无环图(DAG),避免循环依赖。
-
创建
module-info.java
文件。 -
在模块中组织代码和包。
-
编译模块:
javac --module-path mods -d out/com.example.hello $(find com.example.hello -name "*.java")
-
运行模块:
java --module-path out -m com.example.hello/com.example.hello.HelloWorld
相关文章:
Java:JPMS模块化开发
JPMS(Java Platform Module System)简介 为什么用JPMS? JPMS(Java 平台模块系统)是 Java 9 引入的模块化系统,也称为 Jigsaw 项目。它为 Java 提供了更精细的模块化机制,用于组织和管理代码&a…...
Spring Boot中配置Flink的资源管理
在 Spring Boot 中配置 Flink 的资源管理,需要遵循以下步骤: 添加 Flink 依赖项 在你的 pom.xml 文件中,添加 Flink 和 Flink-connector-kafka 的依赖项。这里以 Flink 1.14 版本为例: <!-- Flink dependencies --><de…...
【ruby on rails】dup、deep_dup、clone的区别
一、区别 dup 浅复制:dup 方法创建对象的浅复制。 不复制冻结状态:dup 不会复制对象的冻结状态。 不复制单例方法:dup 不会复制对象的单例方法。 deep_dup 深复制:deep_dup 方法创建对象的深复制,递归复制嵌套的对象。…...
鸿蒙开发-HMS Kit能力集(应用内支付、推送服务)
1 应用内支付 开发步骤 步骤一:判断当前登录的华为账号所在服务地是否支持应用内支付 在使用应用内支付之前,您的应用需要向IAP Kit发送queryEnvironmentStatus请求,以此判断用户当前登录的华为帐号所在的服务地是否在IAP Kit支持结算的国…...
springboot中使用mongodb完成评论功能
pom文件中引入 <!-- mongodb --> <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-mongodb</artifactId> </dependency> yml中配置连接 data:mongodb:uri: mongodb://admin:1234561…...
南京仁品耳鼻喉专科医院:12月启动公益义诊月
专业医疗资源送至“家门口”!南京仁品耳鼻喉专科医院启动公益义诊月 随着2024年即将步入尾声,南京仁品耳鼻喉医院为回馈社会,提升公众健康福祉,将于12月隆重推出“三甲专家公益义诊月”活动。此次活动旨在通过汇聚众多耳鼻喉领域…...
微信小程序首页搜索框的实现教程
微信小程序首页搜索框的实现教程 前言 在现代移动应用中,搜索功能是用户获取信息的主要方式之一。对于购物小程序而言,提供一个美观且高效的搜索框,可以显著提升用户体验,帮助用户快速找到他们想要的商品。本文将详细介绍如何在微信小程序中实现一个样式优美的搜索框,包…...
Educational Codeforces Round 151 (Rated for Div. 2)
题目链接 B. Come Together 题意 输入 输出 思路 可以将B、C坐标作A的变换,将A平移至原点,然后分情况讨论: B、C两点都在轴上,具体分为同向轴和其他情况B、C两点都在象限中,具体分为相同象限、对角象限和相邻象限分别位于象限…...
第二十一天 深度学习简介
深度学习(Deep Learning,简称DL)是机器学习的一个分支,它通过构建和训练深层神经网络模型,从数据中学习和提取特征,以实现复杂任务的自动化处理和决策。以下是对深度学习的详细介绍: 一、起源与…...
mongodb/redis/neo4j 如何自己打造一个 web 数据库可视化客户端?
随笔 从千万粉丝“何同学”抄袭开源项目说起,为何纯技术死路一条? 数据源的统一与拆分 监控报警系统的指标、规则与执行闭环 我们的系统应该配置哪些监控报警项? 监控报警系统如何实现自监控? java 老矣,尚能饭否ÿ…...
elementUI如何dialog对话框 不设置 点击遮罩层 自动关闭的功能
背景 用户在填写dialog对话框的时候,有时候误触 遮罩层,导致form表单直接关闭,用户的信息丢失 代码 要使对话框在点击遮罩层时关闭,您需要在 el-dialog 组件上将 close-on-click-modal 属性设置为 false。以下是更新后的代码&…...
循环神经网络:从基础到应用的深度解析
🍛循环神经网络(RNN)概述 循环神经网络(Recurrent Neural Network, RNN)是一种能够处理时序数据或序列数据的深度学习模型。不同于传统的前馈神经网络,RNN具有内存单元,能够捕捉序列中前后信息…...
LeetCode 100.相同的树
题目: 给你两棵二叉树的根节点 p 和 q ,编写一个函数来检验这两棵树是否相同。 如果两个树在结构上相同,并且节点具有相同的值,则认为它们是相同的。 思路:灵神 代码: class Solution {public boolean…...
序列化与反序列化
序列化是将对象转换为可被存储或传输的格式,例如将对象转换为字节流或字符串。序列化的过程可以将对象的状态保存下来,以便在需要时可以重新创建对象。 反序列化则是将序列化的对象转换回原始的对象形式,以便可以使用和操作这些对象。 序列…...
spring boot打包fat jar
所谓fat jar就是包含所有依赖的jar以及其他开发的代码的jar包。可以通过java -jar xxx.jar直接启动运行,不需要部署到tomcat中间件就能运行。 接下来我们使用maven进行打包: (1)在需要带包的主模块的pom中添加build依赖…...
2021年美亚杯电子数据取证大赛-个人赛
资格赛-案件背景 2021年10月某日早上,本市一个名为"大路建设"的高速公路工地主管发现办公室的计算机被加密并无法开启,其后收到了勒索通知。考虑到高速公路的基建安全,主管决定报警。警方调查人员到达现场取证,发现办公…...
用 React 编写一个笔记应用程序
这篇文章会教大家用 React 编写一个笔记应用程序。用户可以创建、编辑、和切换 Markdown 笔记。 1. nanoid nanoid 是一个轻量级和安全的唯一字符串ID生成器,常用于JavaScript环境中生成随机、唯一的字符串ID,如数据库主键、会话ID、文件名等场景。 …...
泛型擦除是什么?
泛型擦除(Type Erasure)是Java编译器在编译泛型代码时的一种机制,它的目的是确保泛型能够与JAVA的旧版本(即不支持泛型的版本)兼容。泛型擦除会在编译时移除泛型类型信息,并将泛型类型替换为其非泛型的上限类型(通常是Object) 详细解释 在Java中&#…...
鸿蒙Next星河版基础代码
目录: 1、鸿蒙箭头函数的写法2、鸿蒙数据类型的定义3、枚举的定义以及使用4、position绝对定位及层级zIndex5、字符串的拼接转换以及数据的处理(1)字符串转数字(2)数字转字符串(3)布尔值转换情况(4)数组的增删改查 6、三元表达式7、鸿蒙for循环的几种写法7.1、基本用…...
物联网智能项目:智能家居系统的设计与实现
物联网(Internet of Things,IoT)技术正在迅速改变我们的生活方式,特别是在智能家居、工业自动化、环境监控等领域。物联网智能项目通过将设备、传感器、控制器等通过互联网连接,实现设备间的智能交互,带来高效、便捷和智能的体验。本文将介绍一个典型的物联网智能家居项目…...
STL算法之set相关算法
STL一共提供了四种与set(集合)相关的算法,分别是并集(union)、交集(intersection)、差集(difference)、对称差集(symmetric difference)。 目录 set_union set_itersection set_difference set_symmetric_difference 所谓set,可细分为数学上定义的和…...
STM32主要功能
STM32 是由意法半导体(STMicroelectronics)推出的一系列基于 ARM Cortex-M 内核的微控制器(MCU)。STM32 微控制器广泛应用于嵌入式系统中,因其高性能、低功耗、丰富的外设接口和多种封装形式而被广泛采用。其主要功能和…...
【数据结构】--ArrayList与顺序表
文章目录 1. 线性表2. 顺序表3. ArrayList简介4. MyArrayList的实现5. ArrayList使用5.1 ArrayList的构造5.2 ArrayList常见操作5.3 ArrayList的遍历5.4 ArrayList的扩容机制 6. ArrayList的具体使用6.1 简单的洗牌算法6.2 杨辉三角 1. 线性表 线性表(linear list&…...
多线程篇-3--java内存模型(主内存,共享内存,三大特性,指定重排)
Java内存模型 Java Memory Model,简称JMM,本身是一种抽象的概念,实际上并不存在,它描述的是一组规范,通过这组规范定义了程序中各个变量(包括实例字段,静态字段和构成数组对象的元素࿰…...
Android Studio的AI工具插件使用介绍
Android Studio的AI工具插件使用介绍 一、前言 Android Studio 的 AI 工具插件具有诸多重要作用,以下是一些常见的方面: 代码生成与自动补全 代码优化与重构 代码解读 学习与知识获取 智能搜索与资源推荐实际使用中可以添加注释,解读某段代…...
【Yarn Bug】 yarn 安装依赖出现的网络连接问题
最近,在初始化 Ant Design Pro 前端脚手架过程中,使用 yarn 安装依赖时遇到了网络连接问题,具体错误信息提示为 info There appears to be trouble with your network connection. Retrying...。通过百度查询,得知出现这种问题的原…...
Vue3的Setup语法动态获取Dom或调用子组件方法
官方文档:https://cn.vuejs.org/api/composition-api-setup.html#composition-api-setup 获取Dom <template><div class"todo" ref"todoDom" click"handleClick"></div> </template><script lang"t…...
中科院一区算法KO-K均值优化算法(K-means Optimizer)-附Matlab免费代码
首先,使用K-means算法在每次迭代中建立聚类区域的形心向量,然后KO提出两种移动策略,以在开发和探索能力之间建立平衡。每次迭代中探索或开发的移动策略的决定取决于一个参数,该参数将被设计为识别每个搜索代理是否在访问的区域中过…...
python数据可视化销量柱状图练习
需求: 假设某店铺的商品销量分为 线上销量 和 线下销量: 使用 叠加柱状图 分别显示线上和线下销量。 在柱状图中添加每种商品的总销量。 图表美观,包含图例、网格、颜色区分等。 代码实现: import matplotlib.pyplot as plt imp…...
甘特图全面指南:原理、制作与实际案例
甘特图(Gantt Chart)是一种用于项目管理的直观工具,以条形图的形式展示任务的时间进度和依赖关系。它通过简单明了的视觉效果帮助团队跟踪任务进展,分配资源并优化时间安排。本文将深入介绍甘特图的定义、制作方法,以及…...
如何创建 MySQL 数据库的副本 ?
MySQL 是一个广泛使用的开源数据库系统,它提供了多种数据库复制的方法。此功能对于确保跨不同环境的数据可用性和完整性至关重要。 管理 MySQL 数据库通常需要创建数据库的副本。这个任务被称为 MySQL 数据库复制,对于备份、测试、服务器迁移和其他关键…...
基于YOLO模型的目标检测与识别实现在ESP32-S3 EYE上全流程部署
前言 文章首发于 基于YOLO模型的目标检测与识别实现在ESP32-S3 EYE上全流程部署 文章目录 前言项目环境安装ESP-IDF安装开发环境运行环境 训练数据集准备添加自定义数据集 下载预训练模型训练 YOLO 模型模型量化和格式转换模型结果评估训练损失评估指标模型推理 模型部署部署环…...
2411C++,CXImage简单使用
介绍 CxImage是一个可非常简单快速的加载,保存,显示和转换图像的C类. 文件格式和链接的C库 Cximage对象基本上是加了一些成员变量来保存有用信息的一个位图: class CxImage{...protected:void* pDib; //包含标题,调色板,像素BITMAPINFOHEADER head; //标准头文件CXIMAGEINFO…...
Java对象与XML互相转换(xstream)
依赖 <dependency><groupId>com.thoughtworks.xstream</groupId><artifactId>xstream</artifactId><version>1.4.18</version></dependency> 实体类 package com.itheima.util;import lombok.AllArgsConstructor; import lom…...
计算机视觉工程师紧张学习中!
在当今这个日新月异的科技时代,计算机视觉作为人工智能的重要分支,正以前所未有的速度改变着我们的生活和工作方式。为了紧跟时代步伐,提升自我技能,一群怀揣梦想与热情的计算机视觉设计开发工程师们聚集在了本次线下培训活动中。…...
网关整合sentinel无法读取nacos配置问题分析
sentinel无法读取nacos配置问题分析 1.spring-cloud-gateway整合sentinel2.问题现象3.原因猜测4.源码分析4. 结语 最近公司需要上线一个集约项目,虽然为内网项目,但曾经有过内网被攻破,导致内部系统被攻击的案例,且集约系统同时在…...
速盾:高防 CDN 中高级缓存有什么用?
在高防 CDN(Content Delivery Network,内容分发网络)的服务体系里,高级缓存功能犹如一颗强大的 “性能优化引擎”,对于提升网站或应用的运行效率、减轻源站压力以及改善用户体验等诸多方面都发挥着极为关键的作用。 一…...
大数据期末笔记
第一章、大数据概述 人类的行为及产生的事件的一种记录称之为数据。 1、大数据时代的特征,并结合生活实例谈谈带来的影响。 (一)特征 1、Volume 规模性:数据量大。 2、Velocity高速性:处理速度快。数据的生成和响…...
Qt详解QUiLoader 动态加载UI文件
文章目录 详解 QUiLoader 模块的使用1. QUiLoader 简介1.1 应用场景 2. 准备工作2.1 添加模块依赖2.2 引入头文件 3. 使用 QUiLoader 加载界面3.1 示例代码form.uimain.cpp 4. 常用方法详解4.1 load函数原型作用参数返回值示例代码 4.2 createWidget函数原型作用参数返回值示例…...
Android -- 简易音乐播放器
Android – 简易音乐播放器 播放器功能:* 1. 播放模式:单曲、列表循环、列表随机;* 2. 后台播放(单例模式);* 3. 多位置同步状态回调;处理模块:* 1. 提取文件信息:音频文…...
云平台与阿里云服务器使用
云平台 云就是一堆远程计算机组成的集群。 计算就是各种软件服务。 云平台就是远程计算机集群提供的的各种服务所组成的远程服务平台。 云平台提供的服务主要可以分为三个类别: I 服务 P服务 S服务 i就是基础设施服务infrastructure p就是平台服务platform …...
Dart 中 initializer lists
在 Dart 中,initializer lists 是构造函数的一种特性,允许你在进入构造函数体之前对某些字段进行初始化或进行检查。这些字段包括 final 字段,因为 final 字段必须在构造函数体运行之前被初始化。 以下是它的几个关键点和适用场景࿱…...
02.06、回文链表
02.06、[简单] 回文链表 1、题目描述 编写一个函数,检查输入的链表是否是回文的。 2、解题思路: 快慢指针找中点: 利用快慢指针的技巧来找到链表的中间节点。慢指针 slow 每次移动一步,而快指针 fast 每次移动两步。这样&…...
linux中限定特定用户使用crontab
在Linux中,crontab(cron table)是用来定时执行任务的工具。默认情况下,任何用户(包括普通用户)都可以为自己的账户创建和管理crontab条目,但前提是这个用户拥有对/var/spool/cron/crontabs目录的…...
Oracle Universal Unique Identifier (UUID)
本文介绍Oracle生成全局唯一ID的函数SYS_GUID,后续会对SYS_GUID和Sequence两种方法进行比较。 SYS_GUID 函数生成并返回一个由 16 个字节组成的全局唯一标识符(RAW 值)。在大多数平台上,生成的标识符由主机标识符、调用该函数的进…...
LangChain——加载知识库文本文档 PDF文档
文档加载 这涵盖了如何加载目录中的所有文档。 在底层,默认情况下使用 UnstructedLoader。需要安装依赖 pip install unstructuredpython导入方式 from langchain_community.document_loaders import DirectoryLoader我们可以使用 glob 参数来控制加载特定类型文…...
shell编程3,参数传递+算术运算
声明! 学习视频来自B站up主 泷羽sec 有兴趣的师傅可以关注一下,如涉及侵权马上删除文章,笔记只是方便各位师傅的学习和探讨,文章所提到的网站以及内容,只做学习交流,其他均与本人以及泷羽sec团队无关&#…...
Spring boot之BeanDefinition介绍
在spring框架中IOC容器进行bean的创建和管理。Bean的创建是一个比较复杂的过程,它并不像我们创建对象一样只是直接new一下就行,虽然有些bean确实就是New一下。但在Spring中可以通过一些途径对bean进行增强扩展。在这个过程中,BeanDefinition作…...
JAVA:Spring Boot 3 实现 Gzip 压缩优化的技术指南
1、简述 随着 Web 应用的用户量和数据量增加,网络带宽和页面加载速度逐渐成为瓶颈。为了减少数据传输量,提高用户体验,我们可以使用 Gzip 压缩 HTTP 响应。本文将介绍如何在 Spring Boot 3 中实现 Gzip 压缩优化。 2、配置 Spring Boot 3 对…...
探索 IntelliJ IDEA 中 Spring Boot 运行配置
前言 IntelliJ IDEA 作为一款功能强大的集成开发环境(IDE),为 Spring Boot 应用提供了丰富的运行配置选项,定义了如何在 IntelliJ IDEA 中运行 Spring Boot 应用程序,当从主类文件运行应用程序时,IDE 将创建…...