canal+es+kibana+springboot
1、环境准备
服务器:Centos7
Jdk版本:1.8
Mysql版本:5.7.44
Canal版本:1.17
Es版本:7.12.1
kibana版本:7.12.1
软件包下载地址:链接:https://pan.baidu.com/s/1jRpCJP0-hr9aIghC2ZbS4g 提取码:zzzz
IP地址 | 安装软件 |
---|---|
192.168.50.210 | Mysql,Canal |
192.168.50.211 | Es,Kibana |
2、安装es以及kibana
2.1 安装docker
#设置源 wget https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo -O /etc/yum.repos.d/docker-ce.repo # 安装依赖 yum install -y yum-utils device-mapper-persistent-data lvm2 # 安装docker yum install -y docker-ce # 检查安装 docker -v # 启动 systemctl start docker
设置容器镜像加速地址 登录 阿里云容器镜像服务 进入到 镜像工具 -> 镜像加速器
# https://xxxxxxx.mirror.aliyuncs.com 替换成你的地址 !!!!!!!!!!!! sudo mkdir -p /etc/docker sudo tee /etc/docker/daemon.json <<-'EOF' {"registry-mirrors": ["https://xxxxxxx.mirror.aliyuncs.com"] } EOF sudo systemctl daemon-reload sudo systemctl restart docker
设置开机启动
systemctl enable docker.service
2.2 安装es
# 创建容器网络 es-net docker network create es-net # docker 安装 es docker run -d \--name es \-e "ES_JAVA_OPTS=-Xms512m -Xmx512m" \-e "discovery.type=single-node" \-v es-data:/usr/share/elasticsearch/data \-v es-plugins:/usr/share/elasticsearch/plugins \--privileged \--network es-net \-p 9200:9200 \-p 9300:9300 \ elasticsearch:7.12.1 # 开通端口 sudo iptables -A INPUT -p tcp --dport 9200 -j ACCEPT sudo iptables -A INPUT -p tcp --dport 9300 -j ACCEPT
2.3 安装kibana
# docker 安装 kibana docker run -d \ --name kibana \ -e ELASTICSEARCH_HOSTS=http://es:9200 \ -e "I18N_LOCALE=zh-CN" \ --network=es-net \ -p 5601:5601 \ kibana:7.12.1 # 开通端口 sudo iptables -A INPUT -p tcp --dport 5601 -j ACCEPT
3、 安装mysql以及canel
3.1 安装Jdk
# 创建jdk安装路径 mkdir -p /opt/java #将 jdk-8u301-linux-x64.tar.gz 放置 /opt/java mv /youpath/jdk-8u301-linux-x64.tar.gz /opt/java # 解压 cd /opt/java tar -zxvf jdk-8u301-linux-x64.tar.gz # 添加环境变量 vi /etc/profile # 加入如下片段 JAVA_HOME=/opt/java/jdk1.8.0_301 JRE_HOME=/opt/java/jdk1.8.0_301/jre PATH=$PATH:$JAVA_HOME/bin:$JRE_HOME/bin CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar:$JRE_HOME/lib export JAVA_HOME JRE_HOME PATH CLASSPATH # 保存 # 刷新环境变量 source /etc/profile # 检查 java -version
3.2 安装Mysql
# 将安装包 mysql-5.7.44-linux-glibc2.12-x86_64.tar.gz 放入/opt下 cd /opt tar zxvf mysql-5.7.44-linux-glibc2.12-x86_64.tar.gz mv mysql-5.7.44-linux-glibc2.12-x86_64 mysql # 删除安装包 rm mysql-5.7.44-linux-glibc2.12-x86_64.tar.gz # 添加环境变量 vi /etc/profile # 加入如下代码段 export PATH=/opt/mysql/bin:$PATH # 刷新环境变量 source /etc/profile # 创建数据目录 mkdir -p /opt/mysql/data # 创建用户 mysql useradd -m mysql # 将/opt/mysql 权限给到mysql用户 chown -R mysql:mysql /home/mysql/mysql-5.7.44 # 切换用户 su mysql # 初始化mysql mysqld --initialize --user=mysql --basedir=/opt/mysql --datadir=/opt/mysql/data
如下:记录初始密码,下边要用到
# 编写配置文件 vi /etc/my.cnf # 新增或者修改参数如下 [mysqld] symbolic-links=0 # 禁用软连接 user=mysql # 用户 basedir=/opt/mysql datadir=/opt/mysql/data socket=/tmp/mysql.sock lower_case_table_names=1 server-id=1 port=3306 log-bin=/opt/mysql/mysql-bin binlog-format=ROW expire-logs-days=15
#复制启动脚本 cp /opt/mysql/support-files/mysql.server /etc/init.d/mysqld #启动mysql /etc/init.d/mysqld start
# 修改数据库密码 mysql -uroot -p # 这里输入的是上边初始的默认密码mysql>set password=password('root');# 创建用户mysql>use mysql;mysql>CREATE USER 'canal'@'%' IDENTIFIED BY 'canal';mysql>GRANT SELECT, REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO 'canal'@'%';mysql>FLUSH PRIVILEGES;# 创建数据库mysql>create database canal_test character set utf8mb4 collate utf8mb4_bin;mysql>use canal_test;# 创建表mysql>CREATE TABLE open_user(id bigint(21) not null auto_increment,user_name varchar(255) CHARACTER SET utf8mb4 DEFAULT NULL,sex int(11) DEFAULT 1,portrait varchar(255) NOT NULL,create_time datetime DEFAULT NULL,update_time datetime DEFAULT NULL,primary key (id));# 退出mysql>exit;
3.3 安装canal.deployer
# 创建 canal用户 useradd -m canal # 设置密码 passwd canal # 密码为 canal,输入两遍即可 su canal cd ~ mkdir canal-deployer # 将 canal.deployer-1.1.7.tar.gz 移至 canal-deployer mv /youpath/canal.deployer-1.1.7.tar.gz /home/canal/canal-deployer cd /home/canal/canal-deployer tar -zxvf canal.deployer-1.1.7.tar.gz cd conf/example vi instance.properties # 修改如下配置 canal.instance.master.address=127.0.0.1:3306 canal.instance.dbUsername=canal canal.instance.dbPassword=canal # 保存 # 进入到启动命令目录下 cd /home/canal/canal-deployer/bin sh ./startup.sh # 查看日志 tail -f /home/canal/canal-deployer/logs/example/example.log
3.4 安装canal.adapter
# 接上 cd ~ mkdir canal-adapter # 将 canal.adapter-1.1.7.tar.gz 移至 canal-adapter mv /youpath/canal.adapter-1.1.7.tar.gz /home/canal/canal-adapter cd canal-adapter tar -zxvf canal.adapter-1.1.7.tar.gz # 修改配置文件为如下
server:port: 8081 spring:jackson:date-format: yyyy-MM-dd HH:mm:sstime-zone: GMT+8default-property-inclusion: non_nullcanal.conf:mode: tcp #tcp kafka rocketMQ rabbitMQflatMessage: truezookeeperHosts:syncBatchSize: 1000retries: -1timeout:accessKey:secretKey:consumerProperties:# canal tcp consumercanal.tcp.server.host: 127.0.0.1:11111canal.tcp.zookeeper.hosts:canal.tcp.batch.size: 500canal.tcp.username:canal.tcp.password:srcDataSources:defaultDS:url: jdbc:mysql://127.0.0.1:3306/canal_test?useUnicode=true&useSSL=falseusername: canalpassword: canalcanalAdapters:- instance: example # canal instance Name or mq topic namegroups:- groupId: g1outerAdapters:- name: logger- name: es7hosts: http://192.168.50.211:9200 # es地址properties:mode: rest # or rest# security.auth: test:123456 # only used for rest modecluster.name: docker-cluster
处理日期格式化为 yyyy-MM-dd HH:mm:ss 需将 client-adapter.es7x-1.1.7-jar-with-dependencies.jar 替换掉 /home/canal/canal-adapter/plugin 中的 client-adapter.es7x-1.1.7-jar-with-dependencies.jar
# 设置数据以及es映射信息 # 进入到配置目录下的es7目录 cd /home/canal/canal-adapter/conf/es7 # 创建文件 open_user.yml 内容如下:
dataSourceKey: defaultDS #此配置为application.yml 的key destination: example #此配置为canal的name groupId: g1 esMapping:_index: open_user_type: _doc_id: _idsql: "SELECT u.id AS _id,u.user_name AS userName,u.sex,u.portrait,u.create_time as createTime,u.update_time as updateTime FROM open_user u"commitBatch: 3000
# 启动 # 进入启动目录 cd /home/canal/canal-adapter/bin sh startup.sh tail -f /home/canal/canal-adapter/logs/adapter/adapter.log
3.5 初始数据
3.5.1 创建索引
进入kibana控制页面
打开 kibana
地址:http://192.168.50.211:5601
进入开发工具菜单
3.5.2 新增数据
在mysql中增加记录
INSERT INTO canal_test.open_user (id, user_name, sex, portrait, create_time, update_time) VALUES (1, '张三', 2, '学生', '2023-11-02 16:31:21', '2023-11-02 16:39:20'); INSERT INTO canal_test.open_user (id, user_name, sex, portrait, create_time, update_time) VALUES (2, '李四', 1, '美术组组长', '2023-11-03 08:57:32', '2023-11-03 08:57:34'); INSERT INTO canal_test.open_user (id, user_name, sex, portrait, create_time, update_time) VALUES (3, '王五', 1, '班长', '2023-11-03 09:13:35', '2023-11-03 09:13:37'); INSERT INTO canal_test.open_user (id, user_name, sex, portrait, create_time, update_time) VALUES (4, '赵六', 1, '劳动委员', '2023-11-03 09:44:45', '2023-11-03 09:44:46');
3.5.3 导入数据
进入canal 安装服务器 直接调用canal-adapter的Rest API:如下:
curl -X POST http://127.0.0.1:8081/etl/es7/open_user.yml
3.5.4 导入数据
1)查看 adapter.log 日志
tail -f /home/canal/canal-adapter/logs/adapter/adapter.log
2)修改数据库 open_user 表中的数据
update open_user set user_name = '章三' where id = 1;
日志输出如下:
2023-11-03 16:12:02.477 [pool-3-thread-1] INFO c.a.o.canal.client.adapter.logger.LoggerAdapterExample - DML: {"data":[{"id":1,"user_name":"章三","sex":2,"portrait":"学生","create_time":1698913881000,"update_time":1698914360000}],"database":"canal_test","destination":"example","es":1698999121000,"groupId":"g1","isDdl":false,"old":[{"user_name":"张三"}],"pkNames":["id"],"sql":"","table":"open_user","ts":1698999122129,"type":"UPDATE"} 2023-11-03 16:12:02.477 [pool-3-thread-1] DEBUG c.a.o.canal.client.adapter.es.core.support.ESSyncUtil - typeConvert valClass:class java.lang.String val:章三 esType:text 2023-11-03 16:12:02.483 [pool-3-thread-1] DEBUG c.a.o.canal.client.adapter.es.core.service.ESSyncService - DML: {"data":[{"id":1,"user_name":"章三","sex":2,"portrait":"学生","create_time":1698913881000,"update_time":1698914360000}],"database":"canal_test","destination":"example","es":1698999121000,"groupId":"g1","isDdl":false,"old":[{"user_name":"张三"}],"pkNames":["id"],"sql":"","table":"open_user","ts":1698999122129,"type":"UPDATE"} Affected indexes: open_user
4、Spring-boot集成
4.1 创建springboot工程引入如下依赖
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-elasticsearch</artifactId></dependency>
4.2 创建实体类
package com.example.demo.model;import com.alibaba.fastjson.annotation.JSONField; import com.fasterxml.jackson.annotation.JsonFormat; import org.springframework.data.annotation.Id; import org.springframework.data.elasticsearch.annotations.Document; import org.springframework.data.elasticsearch.annotations.Field; import org.springframework.data.elasticsearch.annotations.FieldType;import java.io.Serializable; import java.util.Calendar; import java.util.Date;@Document(indexName = "open_user", type = "_doc") public class OpenUser implements Serializable {@Idprivate String id;@Field(type = FieldType.Text)private String userName;@Field(type = FieldType.Text)private String sex;@Field(type = FieldType.Text)private String portrait;@Field(type = FieldType.Date)@JSONField(format = "yyyy-MM-dd HH:mm:ss")@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")private Date createTime;@Field(type = FieldType.Date)@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")@JSONField(format = "yyyy-MM-dd HH:mm:ss")private Date updateTime;public String getId() {return id;}public void setId(String id) {this.id = id;}public String getUserName() {return userName;}public void setUserName(String userName) {this.userName = userName;}public String getSex() {return sex;}public void setSex(String sex) {this.sex = sex;}public String getPortrait() {return portrait;}public void setPortrait(String portrait) {this.portrait = portrait;}public Date getCreateTime() {return createTime;}public void setCreateTime(Date createTime) {Calendar cal = Calendar.getInstance();cal.setTime(createTime);cal.add(Calendar.HOUR, +8);this.createTime = cal.getTime();}public Date getUpdateTime() {return updateTime;}public void setUpdateTime(Date updateTime) {Calendar cal = Calendar.getInstance();cal.setTime(updateTime);cal.add(Calendar.HOUR, +8);this.updateTime = cal.getTime();}@Overridepublic String toString() {return "OpenUser{" + "id='" + id + '\'' + ", userName='" + userName + '\'' + ", sex='" + sex + '\''+ ", portrait='" + portrait + '\'' + ", createTime=" + createTime + '\'' + ", updateTime=" + updateTime + '}';} }
4.3 创建接口
package com.example.demo.controller;import com.example.demo.model.OpenUser; import org.apache.commons.lang3.StringUtils; import org.elasticsearch.index.query.QueryBuilder; import org.elasticsearch.index.query.QueryBuilders; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data.domain.Page; import org.springframework.data.domain.PageRequest; import org.springframework.data.domain.Pageable; import org.springframework.data.domain.Sort; import org.springframework.data.elasticsearch.core.ElasticsearchTemplate; import org.springframework.data.elasticsearch.core.query.NativeSearchQueryBuilder; import org.springframework.data.elasticsearch.core.query.SearchQuery; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RestController;@RestController public class SearchController {@Autowiredprivate ElasticsearchTemplate elasticsearchTemplate;@PostMapping("/findOpenUserByUserName")public Page<OpenUser> findOpenUserByUserName(@RequestParam(value = "userName") String userName,@RequestParam(value = "pageNum", required = false) Integer pageNum,@RequestParam(value = "pageSize", required = false) Integer pageSize) {if (StringUtils.isBlank(userName)) {return null;}if (pageNum == null || pageNum < 0) {pageNum = 0; // if page is null, page = 0 size default 1}if (pageSize == null || pageSize < 0) {pageSize = 10; // if size is null, size default 10}// 分页,根据时间倒序Pageable pageable = PageRequest.of(pageNum, pageSize, Sort.Direction.DESC, "createTime");// 查询姓名QueryBuilder builder = null;if (userName.matches("^[A-Za-z0-9]+$")) {builder = QueryBuilders.boolQuery().must(QueryBuilders.wildcardQuery("userName", ("*" + userName + "*").toLowerCase()));} else {builder = QueryBuilders.boolQuery().must(QueryBuilders.matchPhraseQuery("userName", userName.toLowerCase()));}SearchQuery searchQuery = new NativeSearchQueryBuilder().withQuery(builder).withPageable(pageable).build();return elasticsearchTemplate.queryForPage(searchQuery, OpenUser.class);} }
4.4 测试
相关文章:

canal+es+kibana+springboot
1、环境准备 服务器:Centos7 Jdk版本:1.8 Mysql版本:5.7.44 Canal版本:1.17 Es版本:7.12.1 kibana版本:7.12.1 软件包下载地址:链接:https://pan.baidu.com/s/1jRpCJP0-hr9aI…...
【力扣】面试经典150题——双指针
文章目录 125. 验证回文串392. 判断子序列167. 两数之和 II - 输入有序数组11. 盛最多水的容器15. 三数之和 125. 验证回文串 如果在将所有大写字符转换为小写字符、并移除所有非字母数字字符之后,短语正着读和反着读都一样。则可以认为该短语是一个 回文串 。 字…...

6-8 最宽层次结点数 分数 10
文章目录 1.题目描述2.本题ac答案2.1法一: 代码复用2.2法二: 顺序队列实现层序遍历 3.C层序遍历求最大宽度3.1层序遍历代码3.2求最大宽度 1.题目描述 2.本题ac答案 2.1法一: 代码复用 //二叉树第i层结点个数 int LevelNodeCount(BiTree T, int i) {if (T NULL || i < 1)re…...

Linux学习第28天:Platform设备驱动开发(二): 专注与分散
Linux版本号4.1.15 芯片I.MX6ULL 大叔学Linux 品人间百味 思文短情长 三、硬件原理图分析 四、驱动开发 1、platform设备与驱动程序开发 53 /* 54 * 设备资源信息,也就是 LED0 所使用的所有寄存器 55 */ 56 static str…...
postgresql数组重叠(有共同元素)查询
直接上最终代码: select distinct id from a where string_to_array(in_area,,) && (select ARRAY_AGG( code) from areas where code like 11% or code 100000)::TEXT[] pg语法: 表 9.48显示了可用于数组类型的运算符。 表 9.48。数组运算符…...
ubuntu系统 生成RSA密钥对
在Ubuntu系统上生成密钥对通常指的是生成SSH密钥对,它常用于安全的远程登录、数据通信和其他安全网络操作。以下是如何在Ubuntu系统上生成SSH密钥对的步骤: 打开终端:你可以使用快捷键 Ctrl Alt T 在Ubuntu上打开一个终端窗口。 运行ssh-k…...

【RtpSeqNumOnlyRefFinder】webrtc m98: ManageFrameInternal 的帧决策过程分析
Jitterbuffer(FrameBuffer)需要组帧以后GOP内的参考关系 JeffreyLau 大神分析 了组帧原理而参考关系(RtpFrameReferenceFinder)的生成伴随了帧决策 FrameDecisionFrameDecision 影响力 帧的缓存。调用 OnAssembledFrame 传递已经拿到的RtpFrameObject 那么,RtpFrameObject…...
centos系统源码编译安装nginx,并编写服务脚本
1.安装编译所需的依赖项: yum install -y gcc pcre-devel openssl-devel zlib-devel2.下载 Nginx 源代码: wget http://nginx.org/download/nginx-1.21.3.tar.gz tar -xf nginx-1.21.3.tar.gz cd nginx-1.21.33.配置编译选项并进行编译和安装ÿ…...
2023下半年软考高项答题技巧!
2023下半年软考倒计时最后一天,一些软考高项答题技巧分享! 高项答题技巧 1、综合知识 (1)首先是分析试题的技巧 –先看清楚问题,再看选项; –判断题目到底考察的是什么知识点,排除干扰项。…...

windows server 2016调优
1. 增加TCP连接的最大数量: 在您当前的注册表路径(HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters)中的右侧窗格,右击空白处,选择“新建” -> “DWORD (32位) 值”。为新的值命名为TcpNu…...

Qt 插件开发详解
1.简介 Qt插件是一种扩展机制,用于将应用程序的功能模块化,并且可以在运行时动态加载和卸载。Qt框架为插件提供了一套标准的接口和管理机制,使得插件的使用和集成变得简单和灵活,通过插件机制,可以将应用程序的功能划…...

vue需求:实现签章/签字在页面上自由定位的功能(本质:元素在页面上的拖拽)
目录 第一章 效果展示 第二章 了解工具 2.1 draggable 2.1.1 了解draggable 2.1.2 draggable方法 2.1.3 利用例子理解方法 第三章 效果实现 3.1 实现思路 3.2 代码实现 3.2.1 涉及到的点 3.2.2 源代 第一章 效果展示 效果描述:通过点击左边栏的签名和…...

【深度学习基础】Pytorch框架CV开发(1)基础铺垫
📢:如果你也对机器人、人工智能感兴趣,看来我们志同道合✨ 📢:不妨浏览一下我的博客主页【https://blog.csdn.net/weixin_51244852】 📢:文章若有幸对你有帮助,可点赞 👍…...

uniapp原生插件之安卓热敏打印机打印插件
插件介绍 安卓热敏打印机打印插件,自动授权,打印机连接监听,打印文本,条形码,二维码,切纸,打印机状态,打印结果查询等 插件地址 安卓热敏打印机打印插件 - DCloud 插件市场 超级…...
巴菲特:卖比亚迪有助于资金配置
巴菲特表示,未来可能会有更多银行倒闭,但储户不必担心,他警告说,陷入困境的银行股不是价值投资,因为即使政府采取行动保护储户,股东的权益也会受到损失。他称,将加大对日本综合商社的投资&#…...
香港服务器有哪些特点
香港服务器具有以下特点: 速度快:香港服务器地理位置优越,与内地服务器相比,网络延迟更低,访问速度更快。 稳定性高:香港服务器位于全球重要的金融中心,网络环境稳定,服务器稳定性高…...

Leetcode76最小覆盖子串
思路:滑动窗口思想 1. 滑动窗口是什么:用一个滑动窗口为覆盖目标子串的字符串 2.怎么移动窗口:当不满足覆盖时右指针移动扩大范围,当覆盖了就移动左指针缩减范围直到再次不覆盖 3. 怎么判断是否覆盖:这里使用两个哈…...

GD32 单片机 硬件I2C死锁解决方法
死锁的复现方式 在I2C恢复函数下个断点(检测到I2C多次超时之后,应该能跳转到I2C恢复函数)使用镊子,将SCL与SDA短接,很快就能看到程序停到恢复函数的断点上,此时再执行恢复函数,看能否正常走出&…...

SPSS两相关样本检验
前言: 本专栏参考教材为《SPSS22.0从入门到精通》,由于软件版本原因,部分内容有所改变,为适应软件版本的变化,特此创作此专栏便于大家学习。本专栏使用软件为:SPSS25.0 本专栏所有的数据文件请点击此链接下…...

【vscode远程开发】使用内网穿透实现在公网环境下远程访问
文章目录 前言1、安装OpenSSH2、vscode配置ssh3. 局域网测试连接远程服务器4. 公网远程连接4.1 ubuntu安装cpolar内网穿透4.2 创建隧道映射4.3 测试公网远程连接 5. 配置固定TCP端口地址5.1 保留一个固定TCP端口地址5.2 配置固定TCP端口地址5.3 测试固定公网地址远程 前言 远程…...

大数据学习栈记——Neo4j的安装与使用
本文介绍图数据库Neofj的安装与使用,操作系统:Ubuntu24.04,Neofj版本:2025.04.0。 Apt安装 Neofj可以进行官网安装:Neo4j Deployment Center - Graph Database & Analytics 我这里安装是添加软件源的方法 最新版…...
在 Nginx Stream 层“改写”MQTT ngx_stream_mqtt_filter_module
1、为什么要修改 CONNECT 报文? 多租户隔离:自动为接入设备追加租户前缀,后端按 ClientID 拆分队列。零代码鉴权:将入站用户名替换为 OAuth Access-Token,后端 Broker 统一校验。灰度发布:根据 IP/地理位写…...
测试markdown--肇兴
day1: 1、去程:7:04 --11:32高铁 高铁右转上售票大厅2楼,穿过候车厅下一楼,上大巴车 ¥10/人 **2、到达:**12点多到达寨子,买门票,美团/抖音:¥78人 3、中饭&a…...
渲染学进阶内容——模型
最近在写模组的时候发现渲染器里面离不开模型的定义,在渲染的第二篇文章中简单的讲解了一下关于模型部分的内容,其实不管是方块还是方块实体,都离不开模型的内容 🧱 一、CubeListBuilder 功能解析 CubeListBuilder 是 Minecraft Java 版模型系统的核心构建器,用于动态创…...

Mac软件卸载指南,简单易懂!
刚和Adobe分手,它却总在Library里给你写"回忆录"?卸载的Final Cut Pro像电子幽灵般阴魂不散?总是会有残留文件,别慌!这份Mac软件卸载指南,将用最硬核的方式教你"数字分手术"࿰…...

Maven 概述、安装、配置、仓库、私服详解
目录 1、Maven 概述 1.1 Maven 的定义 1.2 Maven 解决的问题 1.3 Maven 的核心特性与优势 2、Maven 安装 2.1 下载 Maven 2.2 安装配置 Maven 2.3 测试安装 2.4 修改 Maven 本地仓库的默认路径 3、Maven 配置 3.1 配置本地仓库 3.2 配置 JDK 3.3 IDEA 配置本地 Ma…...

企业如何增强终端安全?
在数字化转型加速的今天,企业的业务运行越来越依赖于终端设备。从员工的笔记本电脑、智能手机,到工厂里的物联网设备、智能传感器,这些终端构成了企业与外部世界连接的 “神经末梢”。然而,随着远程办公的常态化和设备接入的爆炸式…...
GitHub 趋势日报 (2025年06月06日)
📊 由 TrendForge 系统生成 | 🌐 https://trendforge.devlive.org/ 🌐 本日报中的项目描述已自动翻译为中文 📈 今日获星趋势图 今日获星趋势图 590 cognee 551 onlook 399 project-based-learning 348 build-your-own-x 320 ne…...

相关类相关的可视化图像总结
目录 一、散点图 二、气泡图 三、相关图 四、热力图 五、二维密度图 六、多模态二维密度图 七、雷达图 八、桑基图 九、总结 一、散点图 特点 通过点的位置展示两个连续变量之间的关系,可直观判断线性相关、非线性相关或无相关关系,点的分布密…...

【1】跨越技术栈鸿沟:字节跳动开源TRAE AI编程IDE的实战体验
2024年初,人工智能编程工具领域发生了一次静默的变革。当字节跳动宣布退出其TRAE项目(一款融合大型语言模型能力的云端AI编程IDE)时,技术社区曾短暂叹息。然而这一退场并非终点——通过开源社区的接力,TRAE在WayToAGI等…...