SpringBoot3升级WebSocket依赖冲突与打包报错排查实战
1. 项目概述一个典型的SpringBoot3升级兼容性问题最近在将一个老项目从Java 11和SpringBoot 2.x升级到Java 21和SpringBoot 3.2.x时遇到了一个挺典型的构建问题。项目里用到了spring-websocket模块来实现实时消息推送在本地开发环境用mvn spring-boot:run启动一切正常但一执行mvn clean package进行打包构建过程就会在编译阶段直接失败抛出一堆令人困惑的依赖冲突和类找不到的错误。这个场景对于正在进行技术栈升级的团队来说非常普遍表面上看是构建工具的问题但根子往往出在依赖管理、版本兼容性这些更深层的地方。如果你也正卡在类似“开发环境跑得好好的一到打包就报错”的困境里这篇文章就是为你准备的。我会带你完整复盘这次排查和解决的过程不仅告诉你如何修复这个具体的错误更重要的是分享一套处理SpringBoot升级中依赖兼容性问题的通用思路和实操技巧。2. 问题现象与初步诊断执行mvn clean package -X命令后控制台输出的错误信息是排查的起点。错误通常不是单一出现的而是一连串的核心的报错信息往往藏在日志的中后部。我遇到的错误摘要如下[ERROR] Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.11.0:compile (default-compile) on project my-websocket-demo: Fatal error compiling: java.lang.NoClassDefFoundError: org/springframework/web/socket/config/annotation/WebSocketMessageBrokerConfigurer ... [ERROR] Caused by: java.lang.ClassNotFoundException: org.springframework.web.socket.config.annotation.WebSocketMessageBrokerConfigurer ... [WARNING] The POM for org.springframework:spring-websocket:jar:6.0.13 is invalid, transitive dependencies (if any) will not be available: 1 problem was encountered while building the effective model for org.springframework:spring-websocket:6.0.13 [FATAL] Non-parseable POM /Users/xxx/.m2/repository/org/springframework/spring-websocket/6.0.13/spring-websocket-6.0.13.pom: expected START_TAG or END_TAG not TEXT (position: TEXT seen ...dependencies\n\n\n... 6:15) /Users/xxx/.m2/repository/org/springframework/spring-websocket/6.0.13/spring-websocket-6.0.13.pom, line 6, column 15关键信息拆解NoClassDefFoundError和ClassNotFoundException这指向了WebSocketMessageBrokerConfigurer这个接口。在SpringBoot 2.x时代我们配置WebSocket消息代理通常就是实现这个接口。但在SpringBoot 3.x对应Spring Framework 6.x中这个接口已经被标记为Deprecated其替代者是WebSocketMessageBrokerConfigurer接口注意同名但在不同的包下等等这里需要仔细看。实际上Spring Framework 6.0引入了一个新的接口WebSocketMessageBrokerConfigurer位于org.springframework.web.socket.config.annotation包而旧的WebSocketMessageBrokerConfigurer注意多了一个‘r’是Configurer已被弃用。如果你的代码还在引用旧接口而依赖里只有新接口自然就会找不到类。POM文件解析失败这是一个更底层、更致命的信号。Maven警告说spring-websocket:6.0.13这个依赖的POM文件无效无法解析。这通常意味着你本地Maven仓库中下载的该jar包的元数据.pom文件可能已损坏或者Maven在解析该POM文件所声明的传递依赖时遇到了问题。一个损坏的POM文件会导致Maven无法正确计算项目的完整依赖树进而可能引发各种诡异的类找不到错误。初步诊断思路这两个错误看似独立实则可能关联。POM损坏导致Maven不能正确拉取spring-websocket及其传递依赖使得本应可用的新版本类如新的WebSocketMessageBrokerConfigurer在编译时不可见。同时如果代码没有根据SpringBoot 3进行适配仍然引用已被移除的旧类那么即使依赖正确编译也会失败。因此我们的排查需要双线进行一是修复Maven依赖元数据二是检查并升级WebSocket相关的代码。注意不要一看到ClassNotFoundException就盲目地去网上找这个jar包。在SpringBoot项目中绝大多数类都是通过spring-boot-starter-*这种起步依赖间接引入的。直接添加单个模块依赖极易引发版本混乱。2.1 依赖树分析与冲突定位首先我们需要看清项目当前的依赖全貌。使用命令mvn dependency:tree -Dverbose dependency_tree.txt将详细的依赖树输出到文件。-Dverbose参数能显示所有依赖包括那些因为冲突而被忽略的。分析生成的dependency_tree.txt文件重点关注spring-websocket和spring-messagingWebSocket消息代理需要它的版本。在SpringBoot 3项目中它们应该统一由SpringBoot的父BOMBill of Materials管理版本类似于6.0.x。你需要检查是否有其他依赖例如某些第三方库强制引入了旧版本如5.3.x的Spring相关模块这会造成“依赖地狱”。spring-boot-starter-websocket这个Starter是否被正确引入它才是声明WebSocket相关依赖的“正确姿势”。在我的案例中依赖树显示spring-websocket的版本确实是6.0.13但旁边有一个(version managed from 6.0.11)的提示并且没有看到明显的版本冲突。然而这并不能排除本地仓库POM文件损坏的可能性。3. 核心问题排查与解决步骤基于上述诊断我采取了以下步骤顺序很重要。3.1 步骤一清理并刷新本地Maven仓库这是解决任何诡异Maven问题的“万能第一步”尤其是涉及元数据损坏时。不要只删除报错的单个jar包更彻底的做法是找到Maven本地仓库路径通常在用户目录下的.m2/repository。定位到出问题的依赖目录org/springframework/spring-websocket。删除整个6.0.13版本目录例如~/.m2/repository/org/springframework/spring-websocket/6.0.13/。这样会强制Maven在下次构建时重新从远程仓库下载该依赖的所有文件。为了更彻底你也可以一并删除org/springframework/spring-messaging的同版本目录因为它们是紧密相关的。然后在项目根目录执行mvn clean compile -U-U参数强制Maven检查远程仓库的更新确保拉取最新的元数据和构件。实操心得在Windows系统上有时因为文件锁Maven进程可能没有完全释放jar包导致删除失败。可以尝试关闭所有IDE如IntelliJ IDEA、Eclipse和可能使用Maven的命令行窗口再执行删除操作。或者使用mvn dependency:purge-local-repository命令但这会清理整个本地仓库耗时较长。3.2 步骤二验证并修正WebSocket配置代码在清理仓库的同时我们需要检查代码。找到你的WebSocket配置类通常叫WebSocketConfig或WebSocketBrokerConfig。SpringBoot 2.x 的典型配置import org.springframework.web.socket.config.annotation.WebSocketMessageBrokerConfigurer; // 旧接口 Configuration EnableWebSocketMessageBroker public class WebSocketConfig implements WebSocketMessageBrokerConfigurer { // 实现旧接口 Override public void configureMessageBroker(MessageBrokerRegistry config) { config.enableSimpleBroker(/topic); config.setApplicationDestinationPrefixes(/app); } Override public void registerStompEndpoints(StompEndpointRegistry registry) { registry.addEndpoint(/ws).withSockJS(); } }升级到SpringBoot 3.x 必须的修改import org.springframework.web.socket.config.annotation.WebSocketMessageBrokerConfigurer; // 新接口包名相同但接口不同 // 或者更推荐使用新的抽象类SpringBoot 3.1 import org.springframework.web.socket.config.annotation.WebSocketMessageBrokerConfigurer; Configuration EnableWebSocketMessageBroker public class WebSocketConfig implements WebSocketMessageBrokerConfigurer { // 实现新接口 // 方法签名完全一致直接覆盖即可 Override public void configureMessageBroker(MessageBrokerRegistry config) { config.enableSimpleBroker(/topic); config.setApplicationDestinationPrefixes(/app); } Override public void registerStompEndpoints(StompEndpointRegistry registry) { registry.addEndpoint(/ws).withSockJS(); } }关键变化虽然import的包名看起来一样但实现的接口已经从旧的WebSocketMessageBrokerConfigurer已弃用换成了新的WebSocketMessageBrokerConfigurer。在IDE中将光标悬停在implements后面的接口名上应该能看到其全限定名是org.springframework.web.socket.config.annotation.WebSocketMessageBrokerConfigurer。如果IDE提示找不到这个类那很可能就是步骤一中的依赖问题还没解决。重要提示从Spring Framework 6.0 / SpringBoot 3.0开始withSockJS()方法默认不再提供。因为SockJS客户端库在近年来的浏览器中支持度已很高且其本身有一定复杂度。如果你的前端必须使用SockJS需要显式添加依赖dependency groupIdorg.webjars/groupId artifactIdsockjs-client/artifactId version1.5.1/version /dependency否则直接使用registry.addEndpoint(“/ws”)即可。3.3 步骤三检查并统一SpringBoot依赖管理确保你的pom.xml正确继承了SpringBoot的父项目这是版本管理的基石。parent groupIdorg.springframework.boot/groupId artifactIdspring-boot-starter-parent/artifactId version3.2.5/version !-- 使用最新的稳定版 -- relativePath/ !-- lookup parent from repository -- /parent然后引入WebSocket的Starter依赖dependencies dependency groupIdorg.springframework.boot/groupId artifactIdspring-boot-starter-websocket/artifactId /dependency !-- 其他依赖... -- /dependencies绝对不要再像SpringBoot 2时代那样单独指定spring-websocket的版本这会被父BOM管理。单独指定会覆盖BOM的版本管理是冲突的主要来源。3.4 步骤四处理潜在的传递依赖冲突如果执行完前三步问题依旧就需要深入挖掘依赖冲突。使用mvn dependency:tree -Dincludesorg.springframework:*可以只过滤显示Spring相关的依赖更清晰。如果发现存在旧版本Spring如5.x的依赖需要找到引入它的“罪魁祸首”。在dependency_tree.txt中搜索那个旧版本看它的引入路径。然后在你的pom.xml中对该第三方依赖的引入进行排除exclusion操作。dependency groupIdcom.some.thirdparty/groupId artifactIdproblematic-library/artifactId version1.0/version exclusions exclusion groupIdorg.springframework/groupId artifactIdspring-core/artifactId !-- 示例排除具体的旧Spring模块 -- /exclusion exclusion groupIdorg.springframework/groupId artifactIdspring-websocket/artifactId /exclusion /exclusions /dependency踩坑记录我曾遇到一个监控组件依赖了旧版本的spring-context导致整个Spring上下文版本被拉低引发了一系列兼容性问题。通过dependency:tree定位并排除后世界瞬间清净了。4. 完整解决方案与配置示例将上述步骤整合一个完整的、可工作的SpringBoot 3.x Java 21的WebSocket项目pom.xml核心部分如下?xml version1.0 encodingUTF-8? project xmlnshttp://maven.apache.org/POM/4.0.0 xmlns:xsihttp://www.w3.org/2001/XMLSchema-instance xsi:schemaLocationhttp://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd modelVersion4.0.0/modelVersion parent groupIdorg.springframework.boot/groupId artifactIdspring-boot-starter-parent/artifactId version3.2.5/version relativePath/ /parent groupIdcom.example/groupId artifactIdwebsocket-demo/artifactId version0.0.1-SNAPSHOT/version namewebsocket-demo/name descriptionDemo project for Spring Boot 3 Websocket/description properties java.version21/java.version !-- 明确指定Java 21 -- maven.compiler.source21/maven.compiler.source maven.compiler.target21/maven.compiler.target /properties dependencies !-- SpringBoot核心 -- dependency groupIdorg.springframework.boot/groupId artifactIdspring-boot-starter-web/artifactId /dependency !-- WebSocket Starter核心依赖 -- dependency groupIdorg.springframework.boot/groupId artifactIdspring-boot-starter-websocket/artifactId /dependency !-- 测试 -- dependency groupIdorg.springframework.boot/groupId artifactIdspring-boot-starter-test/artifactId scopetest/scope /dependency /dependencies build plugins !-- SpringBoot Maven插件用于打包可执行jar -- plugin groupIdorg.springframework.boot/groupId artifactIdspring-boot-maven-plugin/artifactId /plugin !-- 确保使用与Java 21兼容的编译器插件 -- plugin groupIdorg.apache.maven.plugins/groupId artifactIdmaven-compiler-plugin/artifactId version3.11.0/version !-- 父POM已管理通常无需指定 -- configuration source${java.version}/source target${java.version}/target compilerArgs--enable-preview/compilerArgs !-- 如果使用Java 21预览特性才需要 -- /configuration /plugin /plugins /build /project对应的WebSocket配置类package com.example.websocketdemo.config; import org.springframework.context.annotation.Configuration; import org.springframework.messaging.simp.config.MessageBrokerRegistry; import org.springframework.web.socket.config.annotation.EnableWebSocketMessageBroker; import org.springframework.web.socket.config.annotation.StompEndpointRegistry; import org.springframework.web.socket.config.annotation.WebSocketMessageBrokerConfigurer; Configuration EnableWebSocketMessageBroker public class WebSocketConfig implements WebSocketMessageBrokerConfigurer { Override public void configureMessageBroker(MessageBrokerRegistry config) { // 启用一个简单的基于内存的消息代理将消息路由到以“/topic”为前缀的目的地 config.enableSimpleBroker(/topic); // 将带有“/app”前缀的消息映射到MessageMapping注解的方法 config.setApplicationDestinationPrefixes(/app); } Override public void registerStompEndpoints(StompEndpointRegistry registry) { // 注册一个STOMP端点客户端将使用它连接到我们的WebSocket服务器 registry.addEndpoint(/ws); // 如果需要支持旧版浏览器或不支持WebSocket的环境可以启用SockJS回退选项 // registry.addEndpoint(/ws).withSockJS(); } }完成以上配置后再次执行mvn clean package应该就能顺利构建并生成可执行的jar包了。5. 进阶排查与常见问题实录即使按照上述步骤操作你可能还会遇到一些变体问题。这里记录几个我遇到或社区里常见的案例。5.1 问题一Maven编译器插件版本不兼容Java 21现象mvn package失败错误指向maven-compiler-plugin提示Fatal error compiling: invalid target release: 21。原因较旧版本的maven-compiler-plugin如3.8.x可能不完全支持Java 21的编译目标。解决方案在pom.xml中显式配置更新版本的编译器插件如上文配置示例所示或确保父POMspring-boot-starter-parent的版本足够新3.2.x已包含兼容版本。也可以全局检查Maven使用的JDK版本确保JAVA_HOME环境变量指向Java 21。5.2 问题二SockJS依赖缺失导致运行时错误现象打包成功但应用启动后前端尝试连接WebSocket端点特别是配置了.withSockJS()时失败后台日志报错java.lang.ClassNotFoundException: org.springframework.web.socket.sockjs.transport.handler.SockJsWebSocketHandler。原因SpringBoot 3.x的spring-boot-starter-websocket默认不再捆绑SockJS的传输处理器实现。解决方案如前所述添加webjars的sockjs-client依赖。或者如果你不需要SockJS回退直接从配置中移除.withSockJS()。5.3 问题三与其他Web库的隐性冲突现象项目同时引入了spring-boot-starter-web和spring-boot-starter-webflux响应式Web栈可能导致WebSocket自动配置行为异常。原因SpringBoot的自动配置会根据类路径上的依赖来决定启用Servlet栈还是Reactive栈。两者混用需要非常小心。解决方案对于WebSocket这种通常基于Servlet API的功能建议在标准Servlet栈spring-boot-starter-web下使用。如果项目是响应式的应使用WebSocketHandler和WebSocketSession进行更底层的配置而非基于STOMP的抽象。仔细检查你的依赖移除不必要的starter-webflux。5.4 问题四IDE缓存导致的“灵异”问题现象在命令行Maven构建成功但在IntelliJ IDEA或Eclipse里依然报红或者运行测试失败。原因IDE有自己独立的编译和索引机制缓存了旧的类路径或依赖信息。解决方案IntelliJ IDEA执行File - Invalidate Caches and Restart...。对所有IDE通用在IDE中右键点击项目 -Maven-Reimport。确保IDE使用的JDK版本与pom.xml中配置的一致。6. 构建优化与最佳实践建议解决了基本的打包问题后我们可以进一步优化构建流程和项目结构避免未来再次踩坑。1. 使用Maven Wrapper锁定构建环境在项目根目录执行mvn -N io.takari:maven:wrapper这会生成mvnwUnix和mvnw.cmdWindows脚本以及一个.mvn目录。之后团队协作时使用./mvnw clean package代替mvn clean package可以确保所有人都使用项目指定的Maven版本避免因本地Maven版本差异导致的问题。2. 定期检查依赖更新与漏洞使用mvn versions:display-dependency-updates可以检查所有依赖是否有新版本。对于安全敏感的线上项目应集成OWASP Dependency-Check等工具到CI/CD流程中定期扫描已知漏洞。3. 分离开发与生产配置WebSocket在开发时可能需要放宽跨域限制等。利用Spring的Profile功能将WebSocketConfig拆分为Profile(“dev”)和Profile(“prod”)的配置类或者使用application-dev.yml和application-prod.yml来管理不同的配置项如消息代理中继如果使用RabbitMQ或ActiveMQ代替内存代理的主机、端口、凭证等。4. 为WebSocket端点添加安全性在生产环境中务必为WebSocket端点/ws添加安全约束。可以集成Spring Security通过configure(HttpSecurity)方法对WebSocket握手请求进行认证和授权。Override protected void configure(HttpSecurity http) throws Exception { http .authorizeRequests() .antMatchers(“/ws/**”).authenticated() // 保护WebSocket握手端点 .and() .formLogin() .and() .csrf().disable(); // 注意对于STOMP over WebSocket通常需要禁用CSRF或进行特殊配置 }处理mvn package报错的过程本质上是一次对项目依赖治理和升级规范性的深度体检。从清理本地仓库、修正接口实现到统一依赖管理、排除冲突每一步都围绕着“确保构建环境纯净、依赖版本一致”这个核心。升级到SpringBoot 3和Java 21是大势所趋虽然初期会遇到一些适配成本但其在性能、模块化、新特性支持上带来的收益是显著的。最关键的是通过这次排查建立起对Maven依赖机制和SpringBoot版本管理更深刻的理解以后再遇到类似问题你就能快速定位到是依赖损坏、版本冲突还是代码兼容性问题从而高效解决。

相关新闻

Android嵌套RecyclerView性能优化全解析

Android嵌套RecyclerView性能优化全解析

1. 嵌套RecyclerView的性能痛点解析 在Android开发中,RecyclerView嵌套横向列表是一种常见的UI设计模式。典型的应用场景包括: 电商App的商品分类页面(垂直列表为商品分类,横向列表为具体商品) 视频平台的频道页面&a…

2026/10/16 18:02:32 阅读更多 →
大模型与具身智能的协同落地:从语义理解到机器人运动控制

大模型与具身智能的协同落地:从语义理解到机器人运动控制

我无法根据当前输入内容生成符合要求的博文。 原因如下: 输入中仅提供了项目标题“我们可以给DEEPSEEK鼓掌,但也不必给 宇树 灭灯。”及空的热搜词、网络热词和搜索内容区块(全部为空代码块), 缺乏任何实质性背景信…

2026/10/16 1:31:40 阅读更多 →
PBJ 12英寸液晶手写板评测:无电书写原理与多场景使用指南

PBJ 12英寸液晶手写板评测:无电书写原理与多场景使用指南

在数字笔记和手写输入设备领域,液晶手写板因其护眼、便携和可重复使用的特性,逐渐成为学生、商务人士和创意工作者的常用工具。与传统纸张相比,它无需墨水、无粉尘污染,一键清除功能让草稿、笔记和灵感记录变得高效环保。市面上从…

2026/10/15 23:03:49 阅读更多 →

最新新闻

多径信道仿真:建模、参数设置与避坑指南

多径信道仿真:建模、参数设置与避坑指南

简介:在无线通信中,多径效应导致信号衰落、时延扩展与频率选择性衰落,直接影响系统性能。这份MATLAB仿真程序包面向无线通信初学者与课程设计人员,覆盖信道建模、调制传输、接收均衡与性能评估的完整链路。压缩包为RAR格式&#x…

2026/10/16 18:01:39 阅读更多 →
第一次跑 XERJ 的翻车现场:索引、端口、密钥五个坑

第一次跑 XERJ 的翻车现场:索引、端口、密钥五个坑

第一次跑 XERJ 的翻车现场:索引、端口、密钥五个坑 【免费下载链接】xerj XERJ is the new way for AI to search data. Its autoindex capability activates agents to know your data without the token waste of grep and sed. One command indexes code, docs, …

2026/10/16 18:01:39 阅读更多 →
Token放请求头的正确姿势:Authorization与Bearer详解

Token放请求头的正确姿势:Authorization与Bearer详解

对接第三方接口或者自己公司后端接口的时候,登录接口成功会返回一个token,后面再请求业务接口就得把这个token带上。我第一次做这个的时候,以为随便放到请求参数里就行,结果后端一直返回401,后来才知道token要放在请求…

2026/10/16 18:01:39 阅读更多 →
JSP连接ACCESS数据库入门:新手也能跑通的数据读取教程

JSP连接ACCESS数据库入门:新手也能跑通的数据读取教程

简介:这是一份JSP连接ACCESS数据库入门教程文档,面向Java Web初学者,用于演示通过JDBC-ODBC桥访问Access数据库的完整流程。文档以创建test.mdb数据库、在username表中设置uid与pwd两个文本字段为例,并指导将数据库文件放到TOMCAT…

2026/10/16 18:01:39 阅读更多 →
单向链表从原理到实现:结构、操作、边界调试与真实应用场景

单向链表从原理到实现:结构、操作、边界调试与真实应用场景

说到链表,几乎所有学计算机的人都会在数据结构这门课里碰到它。但说实话,我当年入门的时候也琢磨了很久——数组用得好好的,为什么非要搞一个链表出来?等到真正动手写过几个链表、做过几道算法题、踩过几次指针悬挂的坑之后&#…

2026/10/16 18:01:39 阅读更多 →
Gradle 7.2-all全量包详解:Android构建离线兼容与AGP版本匹配核心指南

Gradle 7.2-all全量包详解:Android构建离线兼容与AGP版本匹配核心指南

简介:本资源为Gradle 7.2版本的完整离线发行包(gradle-7.2-all.zip),专为Android开发者、Java工程构建人员及Android Studio用户设计,旨在解决国内网络环境下Gradle在线下载缓慢、超时或失败导致的项目编译卡顿问题。压…

2026/10/16 18:00:37 阅读更多 →

日新闻

个人 AI Agent 平台接入 TaoToken:统一 Key 与 API 通道的配置大纲

个人 AI Agent 平台接入 TaoToken:统一 Key 与 API 通道的配置大纲

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/16 0:00:05 阅读更多 →
信号与系统频域分析作业解题指南

信号与系统频域分析作业解题指南

1. 作业背景与核心要求解析信号与系统作为电子信息类专业的核心基础课,其作业设计往往直接关联课程的核心知识框架。2026年春季第六次作业的布置,通常对应着课程进展到频域分析的关键阶段。根据常规教学进度推测,本次作业可能涉及以下核心内容…

2026/10/16 0:00:05 阅读更多 →
Django MVT实战:从零构建图书借阅系统,彻底搞懂Model-View-Template分层

Django MVT实战:从零构建图书借阅系统,彻底搞懂Model-View-Template分层

1. 从一个"四不像"的练手项目说起如果你已经看完了Django的官方教程前几章,跟着敲完了投票应用,大概会有一种"我好像会了,又好像什么都不会"的割裂感。教程里每个知识点都是拆开的——这一章讲模型,下一章讲视…

2026/10/16 0:00:05 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/15 16:18:54 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/15 19:41:51 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/16 15:04:24 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/15 0:14:36 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/16 3:49:43 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/16 14:23:36 阅读更多 →