SpringBoot启动横幅Banner机制详解:自定义、动态与关闭实战
1. 启动横幅背后的门道为什么值得单独聊SpringBoot 项目启动时控制台打印的那几行字符画很多人第一次见觉得挺酷第二次见就麻木了第三次见干脆想把它关掉。但如果你仔细想过一个问题——这段 ASCII 字符画到底是怎么被找到、被解析、被渲染出来的——那你其实已经摸到了 SpringBoot 自动配置机制的一个绝佳切入点。Banner这个功能看起来只是“花里胡哨的装饰”但它背后牵扯的东西一点都不简单它涉及SpringApplication的启动流程、Environment的加载时机、资源加载策略、文本编码处理、占位符解析甚至还跟ApplicationContext初始化顺序有微妙的关系。换句话说把 Banner 的机制吃透你对 SpringBoot 启动过程的理解会上一个台阶。这篇文章适合谁看如果你已经能熟练写SpringBootApplication和RestController但对启动流程只有一个模糊印象那这篇内容正好补上这块拼图。如果你是个老手想找一个轻量但完整的案例来给团队讲“SpringBoot 扩展点”Banner 也是个非常好的教学素材。我会从设计思路讲到源码细节再给出一套可以直接抄的实操方案包括自定义 Banner、动态 Banner、关闭 Banner、以及几个我踩过的坑。先给一个最基础的认知SpringBoot 启动时打印的 Banner默认来自 classpath 下的banner.txt文件如果找不到就使用一个内置的默认 Banner。这个查找和打印的过程由SpringApplicationBannerPrinter这个类负责。整个链路不长但每一环都有值得琢磨的地方。2. Banner 机制的整体设计与思路拆解2.1 从 SpringApplication.run 说起Banner 在启动流程中的位置很多人以为 Banner 是 SpringBoot 启动的第一步其实不是。SpringApplication.run()被调用的瞬间最先做的是创建SpringApplication实例、推断应用类型Servlet 还是 Reactive、加载ApplicationContextInitializer和ApplicationListener。Banner 的打印发生在run()方法内部具体是在prepareEnvironment之后、createApplicationContext之前。这个顺序很关键。为什么因为 Banner 的打印依赖Environment而Environment里包含了spring.banner.location、spring.banner.charset这些配置项。如果 Banner 在 Environment 准备好之前就打印那这些配置就读不到。SpringBoot 团队把 Banner 放在这个位置是经过考量的。我用一个简化版的流程来说明public ConfigurableApplicationContext run(String... args) { // 1. 创建 BootstrapContextSpringBoot 2.4 // 2. 配置 headless 属性 // 3. 获取 SpringApplicationRunListeners // 4. 创建并准备 Environment ConfigurableEnvironment environment prepareEnvironment(listeners, bootstrapContext, applicationArguments); // 5. 打印 Banner Banner printedBanner printBanner(environment); // 6. 创建 ApplicationContext context createApplicationContext(); // ... }注意第 5 步printBanner(environment)返回了一个Banner对象这个对象后面还会被注册为一个单例 BeanspringBootBanner。这意味着你不仅能在启动时看到 Banner还能在运行时通过依赖注入拿到它。这个设计挺巧妙的虽然实际用到的人不多。2.2 Banner 接口的设计哲学为什么是 Mode 枚举而不是布尔值Banner接口本身极其简单只有一个方法FunctionalInterface public interface Banner { void printBanner(Environment environment, Class? sourceClass, PrintStream out); enum Mode { OFF, CONSOLE, LOG } }这里有个细节值得说Mode是一个三值枚举而不是一个boolean enabled。为什么因为 Banner 的输出目标有两种——控制台System.out和日志系统。如果只用布尔值你只能表达“打印”或“不打印”没法区分“打印到控制台”和“打印到日志文件”。CONSOLE模式会把 Banner 输出到System.outLOG模式会通过Logger输出通常是 INFO 级别OFF则完全不打印。默认值是CONSOLE。这个设计体现了 SpringBoot 一贯的风格用枚举代替布尔值为未来扩展留空间。虽然目前只有三种模式但万一以后要加“输出到文件”或“输出到远程”枚举加一个值就行不用改接口签名。2.3 Banner 查找策略优先级与回退机制SpringApplicationBannerPrinter的查找逻辑是这样的先看Environment里有没有spring.banner.location配置如果有加载指定位置的资源。如果没有配置尝试加载 classpath 下的banner.txt。如果banner.txt不存在尝试加载banner.gif、banner.jpg、banner.png图片 Banner。如果都没有使用SpringBootBanner这个内置的默认实现。这里有个容易忽略的点图片 Banner 的优先级其实在文本 Banner 之后。也就是说如果你同时放了banner.txt和banner.png文本会赢。这个顺序在SpringApplicationBannerPrinter的getBanner方法里写得很清楚。另外spring.banner.image.location可以单独指定图片 Banner 的位置它和spring.banner.location是两条独立的查找路径。文本 Banner 找不到会回退到图片 Banner但图片 Banner 找不到不会反过来找文本。2.4 占位符与变量Banner 不只是静态文本banner.txt里可以写${...}占位符这些占位符会在打印时被替换。支持的变量包括变量名含义示例值${spring-boot.version}SpringBoot 版本3.2.0${spring-boot.formatted-version}格式化版本v3.2.0${application.version}应用版本来自 MANIFEST.MF1.0.0${application.formatted-version}格式化应用版本v1.0.0${application.title}应用标题MyApp${AnsiColor.BRIGHT_RED}ANSI 颜色常量转义序列这些变量由Banner的默认实现通过PropertyResolver解析。注意${application.version}依赖MANIFEST.MF文件如果你是在 IDE 里直接运行而不是打包成 jar这个值可能是空的。这是个很常见的坑后面我会详细说。ANSI 颜色常量的支持也很有意思。banner.txt里写${AnsiColor.BRIGHT_GREEN}打印出来就是绿色。但前提是你的终端支持 ANSI 转义序列。Windows 的 cmd 默认不支持需要开启 VT100 模式或者用 Windows Terminal。这个细节在跨平台开发时经常被忽略。3. 核心细节解析与实操要点3.1 自定义 banner.txt从零写一个能看的字符画最直接的自定义方式就是在src/main/resources下放一个banner.txt。但“能看”和“好看”是两回事。我见过太多人随便找个在线工具生成一堆字符结果在终端里显示得歪歪扭扭。字符画的核心问题是字体。ASCII 字符画依赖等宽字体如果终端用了比例字体整个图案就会错位。所以第一步是确认你的终端字体是等宽的比如 Consolas、Monaco、Fira Code。第二步是控制宽度一般建议不超过 80 个字符因为很多终端的默认宽度就是 80。超过这个宽度会换行图案就毁了。我常用的一个模板结构是这样的${AnsiColor.BRIGHT_CYAN} _____ _ ____ _ / ____| | | _ \ | | | (___ | |_ __ _ _ __| |_) | ___ ___ | |_ \___ \| __/ _ | __| _ / _ \ / _ \| __| ____) | || (_| | | | |_) | (_) | (_) | |_ |_____/ \__\__,_|_| |____/ \___/ \___/ \__| ${AnsiColor.BRIGHT_GREEN} :: SpringBoot :: (v${spring-boot.version}) ${AnsiColor.DEFAULT}这里有几个实操要点。第一${AnsiColor.BRIGHT_CYAN}后面要换行否则颜色转义序列会和图案混在一起。第二最后一定要加${AnsiColor.DEFAULT}重置颜色不然终端后续输出都会带着颜色。第三版本号那行用${spring-boot.version}而不是硬编码这样升级 SpringBoot 时不用改 Banner。3.2 图片 Banner 的转换逻辑像素怎么变成字符图片 Banner 的支持是 SpringBoot 1.3 引入的。它的原理不复杂把图片按比例缩放到合适尺寸然后根据每个像素的亮度映射到不同的字符。亮度越低字符越“密”比如、#亮度越高字符越“疏”比如.、 。支持的图片格式有 GIF、JPG、PNG。GIF 还支持动画但实际效果嘛……我试过一次终端里闪得眼睛疼不建议在生产环境用。图片 Banner 的配置项有几个spring.banner.image.locationclasspath:banner.png spring.banner.image.width80 spring.banner.image.height20 spring.banner.image.margin2 spring.banner.image.invertfalsewidth和height控制输出尺寸。如果不指定默认宽度是 72高度按图片比例自动算。margin是左边距invert用于反转亮度映射深色背景的终端可能需要。这里有个坑图片 Banner 的渲染质量高度依赖原图。如果原图细节太多缩放到 80x20 之后基本就是一团糊。所以选图要选轮廓清晰、对比度高的最好是黑白线条图。彩色图转成字符后颜色信息会丢失除非你用 ANSI 颜色但 SpringBoot 默认不支持彩色图片 Banner。3.3 编程式自定义实现 Banner 接口如果你需要更复杂的逻辑比如根据环境动态生成 Banner可以实现Banner接口public class CustomBanner implements Banner { Override public void printBanner(Environment environment, Class? sourceClass, PrintStream out) { String appName environment.getProperty(spring.application.name, Unknown); String profile String.join(,, environment.getActiveProfiles()); out.println(); out.println( Application: appName); out.println( Profile: (profile.isEmpty() ? default : profile)); out.println( Time: LocalDateTime.now()); out.println(); } }然后在启动类里设置public static void main(String[] args) { SpringApplication app new SpringApplication(MyApp.class); app.setBanner(new CustomBanner()); app.run(args); }或者用setBannerMode(Banner.Mode.OFF)直接关掉。编程式自定义的优势是灵活你可以读任何Environment里的属性可以做条件判断甚至可以调用外部服务获取信息。但缺点是代码和启动逻辑耦合如果只是改个图案没必要走这条路。3.4 关闭 Banner 的三种方式与适用场景有时候 Banner 确实碍事比如在 CI/CD 流水线里日志被 Banner 占了好几行看起来烦。关闭方式有三种第一种在application.properties里加spring.main.banner-modeoff第二种在启动类里app.setBannerMode(Banner.Mode.OFF);第三种通过命令行参数java -jar myapp.jar --spring.main.banner-modeoff三种方式优先级不同。命令行参数 编程式设置 配置文件。实际用的时候我一般推荐配置文件方式因为不用改代码不同环境可以灵活控制。比如开发环境开着看个乐生产环境关掉省日志空间。注意spring.main.banner-mode这个属性是在Environment准备好之后才读取的所以它不能放在bootstrap.properties里那是 SpringCloud 的上下文。如果你用了 SpringCloud配置要放在application.properties里。3.5 Banner 与日志系统的交互细节当banner-modelog时Banner 会通过Logger输出。这里有个细节SpringBoot 在打印 Banner 的时候日志系统其实还没有完全初始化。具体来说LoggingApplicationListener是在ApplicationEnvironmentPreparedEvent事件触发时才初始化日志系统的而 Banner 的打印在prepareEnvironment之后。所以如果你把banner-mode设为logBanner 会使用默认的日志配置通常是 Logback 的默认配置而不是你在application.properties里配置的日志格式。这个行为在 SpringBoot 2.x 和 3.x 里略有差异3.x 对日志初始化时机做了调整但大体逻辑没变。我实测下来的经验是如果日志配置里有自定义的PatternLayoutBanner 的输出格式可能和你预期的不一样。解决办法要么用console模式要么接受这个差异。4. 实操过程与核心环节实现4.1 环境准备与项目骨架搭建先明确一下实操环境JDK 17、Maven 3.9、SpringBoot 3.2.x。这个组合是目前的主流SpringBoot 3.x 对 JDK 17 是硬性要求如果你还在用 JDK 8建议先升级否则很多新特性用不了。创建一个最小项目pom.xml里只需要一个依赖dependency groupIdorg.springframework.boot/groupId artifactIdspring-boot-starter-web/artifactId /dependency启动类SpringBootApplication public class BannerDemoApplication { public static void main(String[] args) { SpringApplication.run(BannerDemoApplication.class, args); } }先跑一次看看默认 Banner 长什么样。默认 Banner 是 SpringBoot 的 logo 加上版本号长这样. ____ _ __ _ _ /\\ / ____ __ _ _(_)_ __ __ _ \ \ \ \ ( ( )\___ | _ | _| | _ \/ _ | \ \ \ \ \\/ ___)| |_)| | | | | || (_| | ) ) ) ) |____| .__|_| |_|_| |_\__, | / / / / |_||___//_/_/_/ :: Spring Boot :: (v3.2.0)这个默认 Banner 定义在SpringBootBanner类里是一个字符串常量数组。你可以直接看源码就在org.springframework.boot包下。4.2 编写自定义 banner.txt 并验证在src/main/resources下新建banner.txt内容如下${AnsiColor.BRIGHT_YELLOW} _ ____ ____ _____ ____ / \ | _ \| _ \| ____| _ \ / _ \ | |_) | | | | _| | |_) | / ___ \| __/| |_| | |___| _ /_/ \_\_| |____/|_____|_| \_\ ${AnsiColor.BRIGHT_GREEN} :: Application :: ${spring.application.name:Demo} (v${application.version:dev}) :: Spring Boot :: ${spring-boot.formatted-version} ${AnsiColor.DEFAULT}同时在application.properties里加上spring.application.nameBannerDemo启动项目你会看到黄色的大字 “APP” 加上绿色的信息行。这里我用了${spring.application.name:Demo}这种带默认值的写法冒号后面是默认值如果属性不存在就用默认值。这个语法是 Spring 的PropertyPlaceholderHelper支持的很实用。验证要点确认颜色是否生效。如果终端不支持 ANSI你会看到${AnsiColor.BRIGHT_YELLOW}被原样打印出来或者变成乱码。这时候要么换终端要么去掉颜色变量。4.3 动态 Banner 的实现根据 Profile 切换图案静态 Banner 看久了会腻能不能根据环境切换可以。思路是自定义Banner实现在printBanner方法里读取Environment的 active profiles然后选择不同的图案。public class ProfileAwareBanner implements Banner { private static final String DEV_BANNER \n DEV MODE \n; private static final String PROD_BANNER \n PRODUCTION \n; Override public void printBanner(Environment environment, Class? sourceClass, PrintStream out) { String[] profiles environment.getActiveProfiles(); boolean isProd Arrays.asList(profiles).contains(prod); out.println(isProd ? PROD_BANNER : DEV_BANNER); } }然后在启动类里注册public static void main(String[] args) { SpringApplication app new SpringApplication(BannerDemoApplication.class); app.setBanner(new ProfileAwareBanner()); app.run(args); }启动时加--spring.profiles.activeprod就会打印生产环境的 Banner。这个方案的好处是直观坏处是 Banner 内容硬编码在 Java 里改起来要重新编译。如果图案经常变建议把图案放在资源文件里用ClassPathResource读取。4.4 图片 Banner 的完整配置流程准备一张黑白线条图尺寸建议 400x100 像素左右格式 PNG。放到src/main/resources/banner.png。在application.properties里配置spring.banner.image.locationclasspath:banner.png spring.banner.image.width60 spring.banner.image.height15 spring.banner.image.invertfalse启动后观察输出。如果图案太暗或太亮调整invert。如果太宽或太窄调整width。注意height如果不指定SpringBoot 会按原图比例自动计算但有时候自动算出来的高度不合适手动指定更可控。我实测下来图片 Banner 的效果在深色终端上普遍比浅色终端好因为默认的亮度映射是“暗像素用密字符”深色背景上看起来更自然。如果你的终端是浅色背景把invert设为true试试。4.5 参数计算图片缩放与字符映射的量化分析图片 Banner 的核心是缩放算法。SpringBoot 用的是简单的最近邻插值nearest neighbor不是双线性或双三次。这意味着缩放后的图片会有锯齿但对于字符画来说锯齿反而不是大问题因为字符本身就是离散的。具体计算过程假设原图是 800x200目标宽度 80那么缩放比例是 80/800 0.1目标高度是 200 * 0.1 20。如果手动指定了height15那高度比例是 15/200 0.075宽度比例和高度比例不一致图片会被拉伸或压缩。所以建议要么只指定宽度要么宽高都按原图比例算好再填。字符映射的量化SpringBoot 把像素亮度0-255映射到一个字符数组。默认的字符集大概是这样的从暗到亮%#*-:.亮度 0 映射到亮度 255 映射到空格。中间按线性插值。如果你觉得默认字符集不好看可以自定义但需要自己实现Banner接口因为 SpringBoot 没提供配置字符集的入口。4.6 完整实操记录从零到一跑通所有 Banner 模式我把整个实操过程整理成一个清单你可以照着做创建 SpringBoot 项目确认能正常启动。观察默认 Banner记录输出内容。添加banner.txt写入自定义字符画启动验证。修改banner.txt加入${spring-boot.version}和颜色变量启动验证。添加banner.png配置图片 Banner 参数启动验证。实现CustomBanner通过setBanner注册启动验证。分别用配置文件、编程式、命令行三种方式关闭 Banner验证优先级。把banner-mode设为log观察日志输出格式。每一步的预期结果和实际结果如果有差异大概率是环境问题终端不支持 ANSI、JDK 版本不对、Maven 依赖没刷新。排查的时候先看启动日志有没有报错再看 Banner 相关配置有没有被正确加载。5. 常见问题与排查技巧实录5.1 Banner 不显示或显示乱码的排查思路这是最高频的问题。排查顺序如下第一确认banner.txt的位置。必须是src/main/resources/banner.txt打包后位于 classpath 根目录。如果你放在src/main/resources/static/下SpringBoot 找不到。第二确认文件编码。banner.txt必须是 UTF-8 编码如果是 GBK中文字符会乱码。SpringBoot 默认用 UTF-8 读取可以通过spring.banner.charset修改但建议统一用 UTF-8。第三确认终端支持 ANSI。如果用了颜色变量但终端不支持会显示转义序列原文。Windows 的 cmd 需要chcp 65001切换代码页或者用 Windows Terminal。第四确认banner-mode不是off。检查application.properties和启动参数。第五确认没有多个banner.txt。如果 classpath 下有多个同名文件比如依赖 jar 里也有加载顺序不确定。用mvn dependency:tree排查。5.2 版本号占位符为空的原因与解决${application.version}为空是最常见的困惑之一。原因很简单这个值来自MANIFEST.MF文件而MANIFEST.MF只在打包成 jar 或 war 时才生成。在 IDE 里直接运行main方法时classpath 下没有MANIFEST.MF所以值为空。解决办法有两个。一是用${spring-boot.version}代替这个值总是存在。二是配置 Maven 插件在pom.xml里加plugin groupIdorg.springframework.boot/groupId artifactIdspring-boot-maven-plugin/artifactId configuration mainClasscom.example.BannerDemoApplication/mainClass /configuration /plugin然后打包运行java -jar target/xxx.jar${application.version}就有值了。注意application.version读的是Implementation-Version需要在pom.xml里设置version标签Maven 会自动写入MANIFEST.MF。5.3 图片 Banner 显示效果差的调优方法图片 Banner 效果差通常有三个原因原图太复杂、尺寸不合适、终端字符宽度不一致。调优步骤先把原图转成黑白用图像处理工具比如 GIMP 或在线工具提高对比度。然后缩小到目标尺寸看看轮廓是否还清晰。如果模糊说明原图细节太多需要简化。尺寸方面宽度建议 60-80高度 15-25。太宽会换行太窄看不清。高度太小会压扁太大占屏幕。终端字符宽度方面确保终端用的是等宽字体。如果字符宽度不一致图案会错位。这个在 macOS 的 Terminal 和 Linux 的各种终端上一般没问题Windows 上要注意。5.4 常见问题速查表问题现象可能原因解决方法Banner 完全不显示banner-modeoff检查配置文件和启动参数显示默认 Bannerbanner.txt未找到确认文件在 classpath 根目录颜色变量原样输出终端不支持 ANSI换终端或去掉颜色变量版本号为空IDE 运行无 MANIFEST.MF打包运行或用 spring-boot.version图片 Banner 模糊原图太复杂或尺寸不对简化原图调整 width/height中文乱码文件编码不是 UTF-8转成 UTF-8 编码Banner 输出到日志格式不对日志系统未完全初始化用 console 模式或接受差异5.5 几个我踩过的坑和独家技巧第一个坑banner.txt里的反斜杠。ASCII 字符画里经常有\字符但在 Java 的 properties 文件里\是转义字符。不过banner.txt不是 properties 文件它是纯文本所以\不需要转义。但如果你把 Banner 内容写在application.properties里不推荐那就需要转义了。第二个坑Banner 的打印时机和ApplicationContext的关系。Banner 打印时ApplicationContext还没创建所以你不能在 Banner 里注入任何 Bean。如果你需要读取数据库或调用服务来生成 Banner做不到。这是设计上的限制不是 bug。第三个技巧用${spring.application.name}做动态 Banner。如果你有多个微服务每个服务的spring.application.name不同可以在banner.txt里用这个变量这样所有服务共用一个 Banner 模板但显示不同的应用名。这个技巧在微服务架构里很实用。第四个技巧Banner 的Mode.LOG配合日志文件。如果你把 Banner 输出到日志文件可以在日志分析工具里快速识别应用启动。但要注意日志文件的大小Banner 占不了几行问题不大。第五个技巧用spring.banner.location指向外部文件。比如spring.banner.locationfile:/etc/myapp/banner.txt这样可以在不重新打包的情况下更换 Banner。这个在容器化部署时很有用Banner 可以通过 ConfigMap 或挂载卷注入。6. 扩展玩法把 Banner 做成团队规范的一部分6.1 多环境 Banner 的工程化方案如果你的团队有多个项目每个项目都要配 Banner手动复制粘贴效率太低。可以做一个内部的banner-starter把 Banner 逻辑封装成自动配置。思路是创建一个spring-boot-starter模块里面包含Banner的实现和spring.factoriesSpringBoot 3.x 用AutoConfiguration.imports。其他项目引入这个 starter就自动获得统一的 Banner 风格。具体实现AutoConfiguration public class BannerAutoConfiguration { Bean ConditionalOnMissingBean(Banner.class) public Banner teamBanner() { return new TeamBanner(); } }然后在META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports里注册这个类。这样其他项目只要引入依赖就会自动使用TeamBanner。如果项目想自定义自己声明一个BannerBean 就行ConditionalOnMissingBean会保证不冲突。这个方案的好处是统一了团队规范新项目不用重复配置。坏处是增加了一个内部依赖如果 starter 更新了 Banner所有项目都会变。所以建议把 Banner 内容做成可配置的通过application.properties控制。6.2 Banner 与 CI/CD 的集成实践在 CI/CD 流水线里Banner 可以用来标识构建信息。比如在banner.txt里加入构建号、Git 提交哈希、构建时间。这些信息可以通过 Maven 的资源过滤resource filtering注入。在pom.xml里开启资源过滤build resources resource directorysrc/main/resources/directory filteringtrue/filtering /resource /resources /build然后在banner.txt里写Build: ${build.number} Commit: ${git.commit.id.abbrev} Time: ${build.time}配合maven-resources-plugin和git-commit-id-plugin这些占位符会在打包时被替换成实际值。这样每次启动应用你都能看到这个 jar 是哪个构建产出的排查问题时非常有用。注意资源过滤会处理所有src/main/resources下的文件包括二进制文件。如果banner.png被过滤可能会损坏。解决办法是把图片放在单独的目录不参与过滤或者用maven-resources-plugin的nonFilteredFileExtensions排除图片格式。6.3 从 Banner 延伸SpringBoot 启动扩展点全景Banner 只是 SpringBoot 启动扩展点的一个。如果你对启动流程感兴趣可以顺着这条线继续挖ApplicationContextInitializer在ApplicationContext刷新前执行可以修改上下文。ApplicationListener监听启动事件比如ApplicationStartedEvent、ApplicationReadyEvent。EnvironmentPostProcessor在Environment准备好之后、ApplicationContext创建之前执行可以修改配置。SpringApplicationRunListener监听整个启动过程粒度更细。这些扩展点和 Banner 一样都是 SpringBoot 留给开发者的“钩子”。理解它们的执行顺序和适用场景你就能在启动过程中做很多定制化的事情比如动态配置、健康检查、启动耗时统计等。Banner 虽然小但它是一个很好的入口。从它出发你可以逐步理解 SpringBoot 的启动机制、自动配置原理、条件装配等核心概念。我个人的经验是学框架不要一上来就啃源码找一个像 Banner 这样的小功能把它彻底搞明白比泛泛地看一遍源码收获大得多。最后分享一个我常用的 Banner 模板放在banner.txt里既有颜色又有版本信息还不会太花哨${AnsiColor.BRIGHT_BLUE} ___ ___ ___ ___ ___ |___||___||___||___||___| ${AnsiColor.BRIGHT_GREEN} :: ${spring.application.name:App} :: ${spring-boot.formatted-version} :: ${AnsiColor.DEFAULT}这个模板的好处是宽度固定不会因为应用名太长而换行。如果你的应用名很长建议截断或者用缩写。Banner 的第一原则是“不破坏终端排版”好看是第二位的。

相关新闻

oh-my-agent基准测试解读:5种Claude Code框架同场对决,它为什么拿了80.6分

oh-my-agent基准测试解读:5种Claude Code框架同场对决,它为什么拿了80.6分

人工智能AI Agent多智能体Agent 编排Agent 评测AI 技能开发工具CLI 【免费下载链接】oh-my-agent Mechanical verification for AI coding agents — skills pack or full harness (stop-hook gates, artifact checks, independent judges). 项目地址: https://gitc…

2026/10/12 16:47:44 阅读更多 →
2026最新热门AI编程工具推荐(10款权威盘点):用TaoToken统一Key接入IDE实测

2026最新热门AI编程工具推荐(10款权威盘点):用TaoToken统一Key接入IDE实测

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

2026/10/12 16:47:43 阅读更多 →
MATLAB编程进阶:从脚本到工程级代码的实战指南

MATLAB编程进阶:从脚本到工程级代码的实战指南

写MATLAB程序这件事,我前后写了小十年。从最早用它做课程作业里的矩阵运算,到后来处理现场采集的传感器数据、搭建仿真模型、甚至给别人做工具包,可以说MATLAB既是入门最容易的工具,也是最能暴露一个人编程习惯的镜子。这个系列走…

2026/10/12 16:47:43 阅读更多 →

最新新闻

Scala与Java混编Spark大数据平台源码解析与实战调优

Scala与Java混编Spark大数据平台源码解析与实战调优

简介:这份源码资源面向大数据开发初学者与进阶工程师,提供一套基于Scala与Java构建的Spark大数据处理平台完整实现,可用于学习分布式计算框架的工程结构、核心模块划分与多语言协作方式。压缩包共约2000个文件,大小103.62MB&#…

2026/10/12 19:51:10 阅读更多 →
Windows Server 2022主备域控部署:从AD DS到高可用同步验证

Windows Server 2022主备域控部署:从AD DS到高可用同步验证

简介:针对 Windows Server 2022 环境下 AD 域控的高可用部署,这份 PDF 文档详细拆解了主域控与备域控的搭建流程及同步机制。内容面向负责企业网络管理和维护的 IT 技术人员,尤其适合需要独立完成域控部署、熟悉域环境运行原理的运维工程师。…

2026/10/12 19:51:09 阅读更多 →
微博评论情感分析与LDA主题分析实战:完整项目代码拆解

微博评论情感分析与LDA主题分析实战:完整项目代码拆解

简介:这是一套面向NLP学习者、舆情分析人员及数据挖掘初学者的微博评论分析项目,完整覆盖从微博爬虫、数据清洗、分词预处理到LDA主题建模与情感分析的全流程代码与数据,可直接运行复现。压缩包整体约16.16MB,共39个文件&#xff…

2026/10/12 19:51:09 阅读更多 →
ZXing二维码扫描与生成实战:解码引擎原理及扫码率避坑指南

ZXing二维码扫描与生成实战:解码引擎原理及扫码率避坑指南

简介:这是一份面向Android开发者的Zxing二维码扫描学习资源,适合需要快速集成扫码功能或研究二维码识别原理的移动开发人员。压缩包共1172个文件,大小约4.88MB,包含491个flat编译资源、324个class字节码、134个xml布局与配置、118…

2026/10/12 19:51:09 阅读更多 →
知识工作插件:面向认知流的声明式操作系统内核

知识工作插件:面向认知流的声明式操作系统内核

1. 这不是插件市场,而是一套知识工作者的“操作系统内核”“knowledge-work-plugins”这个标题初看像一个技术名词堆砌——既没动词也没宾语,连个冒号或破折号都没有,更不像常见插件命名习惯(比如“notion-plugin-ai-summarize”&…

2026/10/12 19:51:08 阅读更多 →
如何为OpenMOSS创建自定义Agent:角色提示词编写与Skill配置完整教程

如何为OpenMOSS创建自定义Agent:角色提示词编写与Skill配置完整教程

【免费下载链接】OpenMOSS A self-organizing multi-agent collaboration platform for OpenClaw. Multiple AI agents work as an autonomous team — planning, executing, reviewing, and patrolling tasks with zero human intervention. 项目地址: https://git…

2026/10/12 19:50:05 阅读更多 →

日新闻

复古胶片颗粒感噪点合成器:Canvas ImageData 像素高斯杂色注入算法

复古胶片颗粒感噪点合成器:Canvas ImageData 像素高斯杂色注入算法

在数码相机、高清显示屏与现代矢量图形技术高度发达的今天,画面可以做到绝对的锐利、平滑与无瑕。然而,当一张秋日手账插画或拍立得照片过于“平整无瑕”时,往往会散发出一种冰冷生硬的“数码塑料感(Digital Plasticity&#xff0…

2026/10/12 0:00:59 阅读更多 →
活字印刷古籍线装排版:Canvas 竖排文字与栏线自适应算法

活字印刷古籍线装排版:Canvas 竖排文字与栏线自适应算法

在现代网页与移动端设计中,横排(Horizontal Layout)早已经成为了绝对的主流。然而,当我们翻开泛黄的线装古籍、宋版木刻诗集,或是欣赏一张茶道雅集的手写便签时,那种**自上而下纵向书写、自右向左逐列铺展&…

2026/10/12 0:00:59 阅读更多 →
周日晚间的“精神松绑减震器”:无压力情绪倾倒箱与温和轻声陪伴

周日晚间的“精神松绑减震器”:无压力情绪倾倒箱与温和轻声陪伴

每到周日的晚上八点到十点,很多人心里都会悄悄亮起一盏警示灯。 在心理学上,这种现象有一个专门的称谓——“周日夜晚焦虑症(Sunday Scaries)”。明天又是周一,闹钟又要重新在七点响彻卧房;脑海里仿佛有一个…

2026/10/12 0:00:59 阅读更多 →

周新闻

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

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

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

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

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

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

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

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

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

2026/10/12 0:16:43 阅读更多 →

月新闻

我发现了一个新思路:用 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/11 10:45:37 阅读更多 →
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/12 14:48:49 阅读更多 →
黑夜航拍船只数据集训练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/12 18:11:17 阅读更多 →