当前位置: 首页 > news >正文

基于maven-jar-plugin打造一款自动识别主类的maven打包插件

🧑 博主简介:CSDN博客专家历代文学网(PC端可以访问:https://literature.sinhy.com/#/?__c=1000,移动端可微信小程序搜索“历代文学”)总架构师,15年工作经验,精通Java编程高并发设计Springboot和微服务,熟悉LinuxESXI虚拟化以及云原生Docker和K8s,热衷于探索科技的边界,并将理论知识转化为实际应用。保持对新技术的好奇心,乐于分享所学,希望通过我的实践经历和见解,启发他人的创新思维。在这里,我希望能与志同道合的朋友交流探讨,共同进步,一起在技术的世界里不断学习成长。
技术合作请加本人wx(注明来自csdn):foreast_sea

在这里插入图片描述


在这里插入图片描述

基于maven-jar-plugin打造一款自动识别主类的maven打包插件

引言

相信每个Java开发者都经历过这样的场景:新建一个可执行JAR项目时,总要花几分钟在pom.xml里翻找主类路径,然后小心翼翼地配置到maven-jar-plugin里。更痛苦的是当项目有多个main方法时,稍不留神就会打包失败。这种重复劳动不仅浪费时间,还容易埋下隐患。

在Java项目构建过程中,MANIFEST.MF文件中的Main-Class属性配置是一个关键但容易出错的环节。传统方式需要在pom.xml中显式声明主类路径,这不仅增加了维护成本,在大型多模块项目中更可能因配置遗漏导致运行时异常。Spring Boot通过@SpringBootApplication注解实现自动识别主类的机制广受好评,但在非Spring Boot项目中这种能力却难以直接复用。

本文将深入探讨如何通过开发mainclass-finder-maven-plugin自定义插件,在Maven构建体系中实现智能主类识别与自动注入,既支持常规main方法识别,也可通过指定注解灵活定位主类,最终无缝集成到标准maven-jar-plugin打包流程中。这种方案不仅能提升构建效率,更实现了构建配置的智能化演进。


一、插件开发环境准备

1.1 创建Maven插件项目

首先新建一个标准的Maven项目,pom.xml需要包含以下核心依赖:

<!-- 插件核心依赖 -->
<dependencies><!-- Maven插件开发API --><dependency><groupId>org.apache.maven</groupId><artifactId>maven-plugin-api</artifactId><version>3.8.6</version></dependency><!-- 注解处理器 --><dependency><groupId>org.apache.maven.plugin-tools</groupId><artifactId>maven-plugin-annotations</artifactId><version>3.6.4</version><scope>provided</scope></dependency><!-- 秘密武器:Spring Boot的类扫描工具 --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-loader-tools</artifactId><version>2.7.12</version></dependency>
</dependencies><!-- 插件打包配置 -->
<build><plugins><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-plugin-plugin</artifactId><version>3.6.4</version></plugin></plugins>
</build>

关键依赖说明:

  • maven-plugin-api:插件开发的基础API
  • maven-plugin-annotations:简化开发的注解支持
  • spring-boot-loader-tools:借用Spring Boot强大的类扫描能力

二、核心代码实现解析

2.1 Mojo类完整实现

这是我们插件的"大脑",所有魔法都发生在这里:

import java.io.File;
import java.io.IOException;import org.apache.maven.model.Plugin;
import org.apache.maven.plugin.AbstractMojo;
import org.apache.maven.plugin.MojoExecutionException;
import org.apache.maven.plugin.MojoFailureException;
import org.apache.maven.plugins.annotations.LifecyclePhase;
import org.apache.maven.plugins.annotations.Mojo;
import org.apache.maven.plugins.annotations.Parameter;
import org.apache.maven.project.MavenProject;
import org.codehaus.plexus.util.xml.Xpp3Dom;
import org.springframework.boot.loader.tools.MainClassFinder;
import com.sinhy.nature.utils.ObjectUtils;/*** 主类发现者插件核心实现* 在PROCESS_CLASSES阶段扫描类文件,智能识别主类* * @author lilinhai* @since 2025-04-20 09:49* @version V1.0*/
@Mojo(name = "find", defaultPhase = LifecyclePhase.PROCESS_CLASSES)
public class MainClassFinderMojo extends AbstractMojo {// 类文件输出目录(默认target/classes)@Parameter(defaultValue = "${project.build.outputDirectory}", readonly = true)private File classesDirectory;// Maven项目上下文@Parameter(defaultValue = "${project}", readonly = true)private MavenProject project;/*** 主类属性名配置(可自定义)* 示例:存放到mainClassFoundByFinderPlugin属性*/@Parameter(defaultValue = "mainClassFoundByFinderPlugin")private String mainClassAssignmentAttributeName;/*** 按注解过滤主类(可选配置)* 示例:使用SpringBoot的启动注解*/@Parameterprivate String findByAnnotationOnMainClass;@Overridepublic void execute() throws MojoExecutionException, MojoFailureException {try {// 核心扫描逻辑String mainClass = detectMainClass();// 属性注入和配置修改configureJarPlugin(mainClass);} catch (IOException e) {throw new MojoFailureException("主类扫描失败", e);}}private String detectMainClass() throws IOException, MojoFailureException {String mainClass;// 根据是否配置注解决定扫描策略if (ObjectUtils.isEmpty(findByAnnotationOnMainClass)) {getLog().info("开始扫描标准main方法...");mainClass = MainClassFinder.findSingleMainClass(classesDirectory);} else {getLog().info("按注解[" + findByAnnotationOnMainClass + "]扫描主类...");mainClass = MainClassFinder.findSingleMainClass(classesDirectory, findByAnnotationOnMainClass);}if (mainClass == null) {throw new MojoFailureException("未找到符合条件的主类!检查:"+ (findByAnnotationOnMainClass != null ? "注解@" + findByAnnotationOnMainClass : "main方法"));}return mainClass;}private void configureJarPlugin(String mainClass) throws MojoExecutionException {// 将主类路径存入Maven属性池project.getProperties().setProperty(mainClassAssignmentAttributeName, mainClass);getLog().info("成功识别主类:" + mainClass);// 动态修改maven-jar-plugin配置Plugin jarPlugin = project.getBuild().getPluginsAsMap().get("org.apache.maven.plugins:maven-jar-plugin");if (jarPlugin == null) {throw new MojoExecutionException("请确保已配置maven-jar-plugin!");}// 构建或修改XML配置节点Xpp3Dom config = (Xpp3Dom) jarPlugin.getConfiguration();if (config == null) {config = new Xpp3Dom("configuration");jarPlugin.setConfiguration(config);}// 层级结构:configuration -> archive -> manifest -> mainClassXpp3Dom archiveNode = getOrCreateNode(config, "archive");Xpp3Dom manifestNode = getOrCreateNode(archiveNode, "manifest");Xpp3Dom mainClassNode = getOrCreateNode(manifestNode, "mainClass");// 智能设置值(优先保留用户配置)if (mainClassNode.getValue() == null || mainClassNode.getValue().contains("${")) {mainClassNode.setValue(mainClass);getLog().info("已自动配置maven-jar-plugin");}}// 辅助方法:获取或创建XML节点private Xpp3Dom getOrCreateNode(Xpp3Dom parent, String nodeName) {Xpp3Dom node = parent.getChild(nodeName);if (node == null) {node = new Xpp3Dom(nodeName);parent.addChild(node);}return node;}
}

代码亮点解读:

  1. 双模式扫描:既支持传统main方法,也支持注解标记
  2. 配置兼容:优先保留用户自定义配置
  3. 智能提示:通过getLog()输出构建日志
  4. 健壮性检查:对可能缺失的插件进行预校验

三、插件使用指南

3.1 基础配置

在需要使用的项目中添加:

<build><plugins><!-- 我们的智能插件 --><plugin><groupId>com.sinhy</groupId><artifactId>mainclass-finder-maven-plugin</artifactId><version>2.1.0</version><executions><execution><phase>process-classes</phase><goals><goal>find</goal></goals></execution></executions></plugin><!-- 标准打包插件 --><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-jar-plugin</artifactId><configuration><archive><manifest><!-- 这里使用动态注入的属性 --><mainClass>${mainClassFoundByFinderPlugin}</mainClass></manifest></archive></configuration></plugin></plugins>
</build>

3.2 高级配置示例

当需要使用注解过滤时:

<plugin><groupId>com.sinhy</groupId><artifactId>mainclass-finder-maven-plugin</artifactId><configuration><findByAnnotationOnMainClass>org.springframework.boot.autoconfigure.SpringBootApplication</findByAnnotationOnMainClass><!-- 可选:自定义属性名 --><mainClassAssignmentAttributeName>autoDetectedMainClass</mainClassAssignmentAttributeName></configuration><!-- ...其余配置同上... -->
</plugin>

四、工作原理深度剖析

4.1 执行时机把控

我们将插件绑定到process-classes阶段(即编译生成class文件后),这样就能:

  1. 确保扫描到最新编译的类
  2. 在打包前完成主类配置

4.2 主类扫描的底层逻辑

借助MainClassFinder的两个核心方法:

// 扫描标准main方法
public static String findSingleMainClass(File directory)// 扫描带指定注解的类
public static String findSingleMainClass(File directory, String annotationClassName)

其内部实现原理是:

  1. 遍历目录下的所有.class文件
  2. 使用ASM解析字节码
  3. 检查是否包含main方法
  4. 验证类/方法修饰符是否符合规范
  5. 检查注解标记(如果配置了的话)

4.3 动态配置的奥秘

我们通过修改Maven项目的Properties和Plugin配置来实现动态注入:

// 设置全局属性
project.getProperties().setProperty("mainClassFoundByFinderPlugin", "com.example.Main");// 修改maven-jar-plugin的XML配置
<configuration><archive><manifest><mainClass>com.example.Main</mainClass></manifest></archive>
</configuration>

五、插件运行测试效果

如下图所示,是ddns应用项目成功的实践。图中显示已通过mainclass-finder-maven-plugin插件成功自动获取到项目的主类,且成功注入到jar包中的MANIFEST.MF文件中。
在这里插入图片描述

总结

经过这个插件的开发实践,我们不仅解决了具体的工程问题,更重要的是体会到了Maven插件生态的强大之处。当发现重复的配置工作时,不妨停下来想想:能不能通过自动化手段解决?

这个插件现在已经在我的团队内部使用了半年多,累计节省了数百小时的配置时间。希望它也能给你的项目带来便利,更期待你能在此基础上扩展出更强大的功能!

相关文章:

基于maven-jar-plugin打造一款自动识别主类的maven打包插件

&#x1f9d1; 博主简介&#xff1a;CSDN博客专家&#xff0c;历代文学网&#xff08;PC端可以访问&#xff1a;https://literature.sinhy.com/#/?__c1000&#xff0c;移动端可微信小程序搜索“历代文学”&#xff09;总架构师&#xff0c;15年工作经验&#xff0c;精通Java编…...

利用 HEMT 和 PHEMT 改善无线通信电路中的增益、速度和噪声

本文要点 高电子迁移率晶体管 &#xff08;High electron mobility transistors &#xff0c;HEMTs&#xff09; 和应变式异质接面高迁移率晶体管&#xff08;pseudomorphic high electron mobility transistors &#xff0c;PHEMTs&#xff09; 因其独特的、可提高性能的特点而…...

探秘C#用户定义类型:突破预定义的边界

在C#的编程世界里&#xff0c;除了系统提供的16种预定义类型&#xff0c;开发者还拥有强大的自主能力——创建自己的用户定义类型。这大大拓展了编程的灵活性和可扩展性&#xff0c;让开发者能根据具体需求定制数据结构和功能。 六种用户定义类型 类类型&#xff08;class&am…...

idea中导入从GitHub上克隆下来的springboot项目解决找不到主类的问题

第一步&#xff1a;删除目录下的.idea和target&#xff0c;然后用idea打开 第二步&#xff1a;如果有需要&#xff0c;idea更换jdk版本 原文链接&#xff1a;https://blog.csdn.net/m0_74036731/article/details/146779040 解决方法&#xff08;idea中解决&#xff09;&#…...

北理工宫某的瓜ppt下载地址

关于“北理工宫某瓜”PPT下载地址相关技术探讨 摘要&#xff1a;本文围绕“北理工宫某瓜”事件中PPT下载地址相关情况展开分析&#xff0c;探讨了网络资源传播的技术机制、涉及的网络安全问题以及围绕此类资源分享应遵循的规范和注意事项&#xff0c;旨在从技术角度对这类网络…...

[论文阅读]Making Retrieval-Augmented Language Models Robust to Irrelevant Context

Making Retrieval-Augmented Language Models Robust to Irrelevant Context [2310.01558v2] Making Retrieval-Augmented Language Models Robust to Irrelevant Context 检索增强语言模型&#xff08;RALMs&#xff09;&#xff0c;它包含一个检索机制&#xff0c;以减少将…...

论文阅读:2023 arxiv A Survey of Reinforcement Learning from Human Feedback

A Survey of Reinforcement Learning from Human Feedback https://arxiv.org/pdf/2312.14925 https://www.doubao.com/chat/3506943124865538 速览 这篇论文是关于“从人类反馈中进行强化学习&#xff08;RLHF&#xff09;”的综述&#xff0c;核心是讲如何让AI通过人类反…...

【图像处理基石】什么是去马赛克算法?

RAW数据的Demosaic算法&#xff08;去马赛克算法&#xff09;是图像处理中的关键技术&#xff0c;主要用于将图像传感器&#xff08;如数码相机、手机摄像头&#xff09;采集的原始马赛克数据恢复为完整的RGB三通道图像。 1. RAW数据的特性 马赛克结构&#xff1a;图像传感器…...

transformer注意力机制

单头注意力机制 import torch import torch.nn.functional as Fdef scaled_dot_product_attention(Q, K, V):# Q: (batch_size, seq_len, d_k)# K: (batch_size, seq_len, d_k)# V: (batch_size, seq_len, d_v)batch_size: 一次输入的句子数。 seq_len: 每个句子的词数。 d_mo…...

Ubuntu 22.04 更换 Nvidia 显卡后启动无法进入桌面问题的解决

原显卡为 R7 240, 更换为 3060Ti 后, 开机进桌面时卡在了黑屏界面, 键盘有反应, 但是无法进入 shell. 解决方案为 https://askubuntu.com/questions/1538108/cant-install-rtx-4060-ti-on-ubuntu-22-04-lts 启动后在开机菜单中(如果没有开机菜单, 需要按shift键), 进入recove…...

ROS机器人开发实践->机器人建模与仿真

前言&#xff1a; 这篇博客知识一个整体性的了解对于机器人建模和仿真&#xff0c;更多详细的细节&#xff0c;见 6.4.2 Xacro_语法详解 Autolabor-ROS机器人入门课程《ROS理论与实践》零基础教程 一、整体框架 机器人模型分为两个部分具体的形状和插件。有了这个具体的形状…...

中国占全球工业机器人装机量的52%,国产机器人崛起加速洗牌,拆分机器人业务独立上市,软硬件协同增强,AI工业机械臂催生业务再增长

一、内部战略优化:聚焦核心业务与释放增长潜力 业务协同效应有限 ABB的机器人业务(全球市场份额第二)与集团其他业务(如电气化、过程自动化)的协同性较低。机器人业务专注于柔性制造和智能自动化,而其他业务更偏向能源效率和大型工业系统。分拆后,ABB集团可更聚焦于电气…...

C#森林中的兔子(力扣题目)

C#森林中的兔子(力扣题目) 题目介绍 森林中有未知数量的兔子。提问其中若干只兔子 “还有多少只兔子与你&#xff08;指被提问的兔子&#xff09;颜色相同?” &#xff0c;将答案收集到一个整数数组 answers 中&#xff0c;其中 answers[i] 是第 i 只兔子的回答。 给你数组…...

OSPF特殊区域

四种特殊区域 1、stub 2、完全stub 3、nssa 4、完全nssa 作用&#xff1a;用于优化OSPF的LSDB空间 stub&#xff1a; [R2-ospf-1-area-0.0.0.1]stub //配置一个区域为stub区域 只在ABR上配置的话会导致OSPF邻居关系断开&#xff0c;因为此时Option选项中Nbit和Ebit置位不一致所…...

深入理解 CICD 与 Jenkins 流水线:从原理到实践

前言&#xff1a;在当今数字化飞速发展的时代&#xff0c;软件开发行业的竞争日益激烈。为了能够快速响应市场需求&#xff0c;及时交付高质量的软件产品&#xff0c;开发团队们不断探索和采用新的开发模式与工具。CICD&#xff08;持续集成、持续交付 / 部署&#xff09;作为一…...

1.Vue自动化工具安装(Vue-cli)

目录 1.node.js 安装&#xff1a; 2 npm 安装 3 安装Vue-cli 4总结&#xff1a; 一般情况下&#xff0c;单文件组件&#xff0c;我们运行在 自动化工具vue-CLI中&#xff0c;可以帮我们编译单文件组件。所以我们在学习时一般需要在系统中先搭建vue-CLI工具 下面就是一些我…...

前端亮点:大文件上传技术详解及问题解析

大片文件上传 文件上传 大片文件上传需考虑问题 一、核心实现步骤 分片唯一标识计算 (优化比较时间) • Hash生成:使用SparkMD5或crypto.subtle.digest计算文件整体Hash(秒传依据)及分片Hash(断点续传依据)。 • 优化:通过Web Worker多线程计算,避免主线程阻塞(如…...

每日一题——最小测试用例集覆盖问题

最小测试用例集覆盖问题&#xff08;C语言实现&#xff09; 问题描述 假设我们有一系列测试用例&#xff0c;每个测试用例会覆盖若干个代码模块。 我们使用一个二维数组来表示这些测试用例的覆盖情况&#xff1a; 如果某个测试用例 i 能覆盖代码模块 j&#xff0c;则数组中…...

React 文章 分页

删除功能 携带路由参数跳转到新的路由项 const navigate useNavigate() 根据文章ID条件渲染...

【技术派后端篇】Redis实现统计计数

在互联网项目中&#xff0c;计数器有着广泛的应用场景。以技术派项目为例&#xff0c;诸如文章点赞数、收藏数、评论数以及用户粉丝数等都离不开计数器的支持。在技术派源码中&#xff0c;提供了基于数据库操作记录实时更新和基于 Redis 的 incr 特性实现计数器这两种方案&…...

NHANES指标推荐:RFM

文章题目&#xff1a;Higher relative fat mass was associated with a higher prevalence of gallstones in US adults DOI&#xff1a;10.1186/s12876-025-03715-3 中文标题&#xff1a;在美国成年人中&#xff0c;相对脂肪质量越高&#xff0c;胆结石患病率就越高 发表杂志&…...

嵌入式人工智能应用-第三章 opencv操作 4 灰度处理

嵌入式人工智能应用 嵌入式人工智能应用-第三章 opencv操作 4 灰度处理 嵌入式人工智能应用1 灰度处理2 算法2.1 均值方法2.2 最大值法2.3 分量法2.4 加权平均法&#xff08;Weighted Average Method&#xff09;2.5 系统自带方法 3 总结 1 灰度处理 图像灰处理即是将一幅彩色…...

AI Agent破局:智能化与生态系统标准化的颠覆性融合!

Hi&#xff01;好久不见 云边有个稻草人-个人主页 热门文章_云边有个稻草人的博客-本篇文章所属专栏~ 目录 一、引言 二、AI Agent的基本概念 2.1 定义与分类 2.2 AI Agent的工作原理 2.3 示例代码&#xff1a;AI Agent的基本实现 三、AI Agent在企业数字化转型中的应用 …...

UniFlash以串口方式烧录MSPM0G3507(无需仿真器)

材料&#xff1a;MSPM0G3507黑钢版&#xff0c;只要有UART的其他版本亦可&#xff08;PA14需接LED&#xff09; 下载软件&#xff1a;UniFlash 9.1.0.5175&#xff0c;网址&#xff1a;UNIFLASH 软件编程工具 | 德州仪器 TI.com.cn​​​​​​ 测试文件&#xff1a;MSPM0G30…...

坐标轴刻度QCPAxisTicker

一、QCPAxisTicker 概述 QCPAxisTicker 是 QCustomPlot 中控制坐标轴刻度生成和显示的基类&#xff0c;负责计算刻度位置和生成刻度标签。 二、主要派生类 类名描述QCPAxisTickerFixed固定步长的刻度生成器QCPAxisTickerLog对数坐标刻度生成器QCPAxisTickerPi专门显示π倍数…...

Spring Boot 版本与对应 JDK 版本兼容性

Spring Boot 版本与对应 JDK 版本兼容性 以下是 Spring Boot 主要版本与所需 JDK 版本的对应关系&#xff0c;以及长期支持(LTS)信息&#xff1a; 最新版本对应关系 (截至2024年) Spring Boot 版本发布日期支持的 JDK 版本备注3.2.x (最新)2023-11JDK 17-21推荐使用 JDK 173…...

【MySQL】MySQL的基础语法及其语句的介绍

1、基础语法 mysql -h【主机名】 -u【用户名】 -p //登录MySQL exit或quit; //退出MySQL show database; //查看MySQL下的所有数据库 use 【数据库名】; //进入数据库 show tables; //查看数据库下的所有表名 *MySQL的启动和关闭 &am…...

《汽车理论》第四章作业MATLAB部分

1.计算并绘制利用附着系数曲线和制动效率曲线 clc close all %空载(no load)-1 ;满载(full load)-2 m14080; m29290; hg10.845; hg21.170; L3.950; a12.100; a22.950; b1L-a1; b2L-a2; beta0.38; %利用附着系数与制动强度的关系曲线 z0:0.01:1; phi_f1L*beta.*z./(b1z*hg1);%前…...

SpringCloud实战

环境准备&#xff1a; 1. 一台虚拟机&#xff0c;部署好centos7操作系统、安装好docker 2. 使用docker安装mysql数据库且启动mysql容器 3. IDEA配置的JDK版本是11 4. 前端代码启动Nginx 一、单体架构和微服务的区别&#xff1f; 1. 单体架构 将业务的所有功能集中在一个项目中…...

Cribl 对Windows-xml log 进行 -Serialize-05

The Serialize Function Description​ The Serialize Function is designed to transform an events content into a predefined format. Steps - Adding a Serialize Function​ important Select the Add Function<...

鸿蒙ArkUI之布局实战,线性布局(Column,Row)、弹性布局(Flex)、层叠布局(Stack),详细用法

本文聚焦于ArkUI的布局实战&#xff0c;三种十分重要的布局&#xff0c;线性布局、弹性布局、层叠布局&#xff0c;在实际开发过程中这几种布局方法都十分常见&#xff0c;下面直接上手 线性布局 垂直布局&#xff08;Column&#xff09; 官方文档&#xff1a; Column-行列…...

缓存 --- 内存缓存 or 分布式缓存

缓存 --- 内存缓存 or 分布式缓存 内存缓存&#xff08;In-Memory Cache&#xff09;分布式缓存&#xff08;Distributed Cache&#xff09;内存缓存 vs 分布式缓存 内存缓存和分布式缓存是两种常见的缓存策略&#xff0c;它们在存储位置、访问速度和适用场景上有所不同。下面分…...

【Qt】QMainWindow类

&#x1f308; 个人主页&#xff1a;Zfox_ &#x1f525; 系列专栏&#xff1a;Qt 目录 一&#xff1a;&#x1f525; QMainWindow 概述 &#x1f98b; 菜单栏&#x1f380; 具体使用&#x1f380; 综合案例 &#x1f98b; 工具栏&#x1f98b; 状态栏&#x1f98b; 窗口布局&a…...

缓存 --- 缓存击穿, 缓存雪崩, 缓存穿透

缓存 --- 缓存击穿, 缓存雪崩, 缓存穿透 缓存击穿&#xff08;Cache Breakdown&#xff09;概念原理实际场景代码实现&#xff08;互斥锁方案&#xff09; 缓存雪崩&#xff08;Cache Avalanche&#xff09;概念原理实际场景代码实现&#xff08;随机过期时间&#xff09; 缓存…...

第五章 SQLite数据库:5、SQLite 进阶用法:ALTER 命令、TRUNCATE 操作、视图创建、事务控制和子查询的操作

1. SQLite ALTER 命令 SQLite 的 ALTER TABLE 命令允许在不完全重建表的情况下修改现有的表结构。通过 ALTER TABLE&#xff0c;您可以执行如重命名表名、添加新列等操作&#xff0c;但无法执行复杂的修改&#xff0c;如删除列或修改列的数据类型。 语法 重命名表 用于重命名…...

【2】Kubernetes 架构总览

Kubernetes 架构总览 主节点与工作节点 主节点 Kubernetes 的主节点&#xff08;Master&#xff09;是组成集群控制平面的关键部分&#xff0c;负责整个集群的调度、状态管理和决策。控制平面由多个核心组件构成&#xff0c;包括&#xff1a; kube-apiserver&#xff1a;集…...

【数据结构】红黑树

红黑树&#xff08; R e d B l a c k T r e e Red\ Black\ Tree Red Black Tree&#xff09;是一种自平衡二叉搜索树&#xff0c;也可以看作一种特化的 A V L AVL AVL 树&#xff08;通过颜色规则来实现自平衡功能&#xff09;&#xff0c;都是在进行插入和删除操作时通过特定…...

ThreadLocal - 原理与应用场景详解

ThreadLocal 的基础概念 在 Java 的多线程世界里&#xff0c;线程之间的数据共享与隔离一直是一个关键话题。如果处理不当&#xff0c;很容易引发线程安全问题&#xff0c;比如数据混乱、脏读等。而 ThreadLocal 这个工具类&#xff0c;就像是为线程量身定制的 “私人储物柜”…...

VS Code 远程连接服务器:Anaconda 环境与 Python/Jupyter 运行全指南。研0大模型学习(第六、第七天)

VS Code 远程连接服务器&#xff1a;Anaconda 环境与 Python/Jupyter 运行全指南 在使用 VS Code 通过 SSH 远程连接到服务器进行开发时&#xff0c;尤其是在进行深度学习等需要特定环境的工作时&#xff0c;正确配置和使用 Anaconda 环境以及理解不同的代码运行方式非常关键。…...

chili3d调试6 添加左侧面板

注释前 一个一个注释看对应哪个窗口 无事发生 子方法不是显示的窗口 注释掉看看 没了 注释这个看看 零件页面没了 这个浏览器居然完全不用关的&#xff0c;刷新就重载了 注释看看 无工具栏版本 sidebar&#xff1a; 往框框里面加入 div({ className: style.input }, user_…...

Python变量全解析:从基础到高级的命名规则与数据类型指南

一、变量基础与内存机制 1.1 变量的三元构成 每个Python变量由三个核心要素构成&#xff1a; ​标识&#xff08;Identity&#xff09;​&#xff1a;对象的内存地址&#xff0c;通过id(obj)获取&#xff08;如id(name)输出0x5a1b2c3d&#xff09;​类型&#xff08;Type&am…...

组装一台intel n95纯Linux Server服务器

前言 笔者自己的电脑是macmini m4&#xff0c;平时都是使用虚拟机来充当Linux服务器&#xff08;系统Ubuntu Server&#xff09;&#xff0c;但是毕竟是ARM CPU&#xff0c;而且黄金内存&#xff0c;开不了几个虚拟机&#xff08;加内存不划算&#xff09;&#xff0c;所以组装…...

计算机网络中的网络层:架构、功能与重要性

一、网络层概述 在计算机网络的分层模型中&#xff0c;网络层&#xff08;Network Layer&#xff09;位于 数据链路层 之上&#xff0c;传输层 之下。网络层的主要任务是处理数据包的路由选择、转发以及分段&#xff0c;使得信息能够从源设备传送到目标设备。它还通过 IP协议&…...

Transformer系列(一):NLP中放弃使用循环神经网络架构

NLP中放弃使用循环神经网络架构 一、符号表示与概念基础二、循环神经网络1. 依赖序列索引存在的并行计算问题2. 线性交互距离 三、总结 该系列笔记阐述了自然语言处理&#xff08;NLP&#xff09;中不再采用循环架构&#xff08;recurrent architectures&#xff09;的原因&…...

(学习总结34)Linux 库制作与原理

Linux 库制作与原理 库的概念静态库操作归档文件命令 ar静态库制作静态库使用 动态库动态库制作动态库使用与运行搜索路径问题解决方案方案2&#xff1a;建立同名软链接方案3&#xff1a;使用环境变量 LD_LIBRARY_PATH方案4&#xff1a;ldconfig 方案 使用外部库目标文件ELF 文…...

【QT】 QT中的列表框-横向列表框-树状列表框-表格列表框

QT中的列表框-横向列表框-树状列表框-表格列表框 1.横向列表框(1)主要方法(2)信号(3) 示例代码1:(4) 现象&#xff1a;(5) 示例代码2&#xff1a;加载目录项在横向列表框显示(6) 现象&#xff1a; 2.树状列表框 QTreeWidget(1)使用思路(2)信号(3)常用的接口函数(4) 示例代码&am…...

使用DeepSeek的AIGC的内容创作者,如何看待陈望道先生所著的《修辞学发凡》?

目录 1.从修辞手法的运用角度 2.从语言风格的塑造角度 3.从提高创作效率角度 4.从文化传承与创新角度 大家好这里是AIWritePaper官方账号&#xff0c;官网&#x1f449;AIWritePaper~ 《修辞学发凡》是陈望道 1932 年出版的中国第一部系统的修辞学著作&#xff0c;科学地总…...

使用 GitHub Actions 和 Nuitka 实现 Python 应用(customtkinter ui库)的自动化跨平台打包

目录 引言前置准备配置文件详解实现细节CustomTkinter 打包注意事项完整配置示例常见问题 引言 在 Python 应用开发中&#xff0c;将源代码打包成可执行文件是一个常见需求。本文将详细介绍如何使用 GitHub Actions 和 Nuitka 实现自动化的跨平台打包流程&#xff0c;支持 W…...

【Part 2安卓原生360°VR播放器开发实战】第一节|通过传感器实现VR的3DOF效果

《VR 360全景视频开发》专栏 将带你深入探索从全景视频制作到Unity眼镜端应用开发的全流程技术。专栏内容涵盖安卓原生VR播放器开发、Unity VR视频渲染与手势交互、360全景视频制作与优化&#xff0c;以及高分辨率视频性能优化等实战技巧。 &#x1f4dd; 希望通过这个专栏&am…...

【1】云原生,kubernetes 与 Docker 的关系

Kubernetes&#xff1f;K8s&#xff1f; Kubernetes经常被写作K8s。其中的数字8替代了K和s中的8个字母——这一点倒是方便了发推&#xff0c;也方便了像我这样懒惰的人。 什么是云原生&#xff1f; 云原生&#xff1a; 它是一种构建和运行应用程序的方法&#xff0c;它包含&am…...