戴老师的博客 - springboot
type: channel
link: https://tushu.info/tag/springboot/
items: 可执行jar包
items: spring boot内嵌tomcat访问日志常用配置
items: HiClaw 多代理协作开发实战：用 AI 管理 AI 团队
items: 2025 Mac电脑Jdk,Maven,Idea的安装与配置,Spring boot项目创建
items: Spring Boot Actuator

可执行jar包
type: item
date: 2026-07-09T04:37:35+00:00
description: 我们在日常开发中，无论是普通的 Java 工程还是 Spring Boot 工程，通常都会将项目打包成一个可执行的 JAR 包，并通过 java -jar xxx.jar 命令来运行。本文旨在探索并整理如何生成可执行 JAR 包，以及其背后的实现原理。java -jar xxx.jar 命令的原理当在命令行执行 java -jar xxx.jar 命令时，Java 虚拟机会加载指定的 JAR 包。虚拟机中的 App 类加载器（Application ClassLoader）会获取 JAR 包中的 META-INF/MANIFEST.MF 文件。该清单文件中列出了可执行 JAR 包的入口程序、依赖的 JAR 包路径以及版本号等关键信息。手动创建一个可执行 jar 包理解了上述原理后，我们可以尝试手动创建一个可执行 JAR 包。首先，创建一个简单的类：package guava.list.test; import com.google.common.collect.Lists; import java.util.ArrayList; public class ListTest { public static void main(String[] args.html) { ArrayList<Integer> list = Lists.newArrayList(1, 2, 3.html); System.out.println(list.html); } }为了测试可执行 JAR 包对第三方库的依赖，该类依赖了 guava 库。使用 javac 命令编译该文件：javac -cp libs/* guava/list/test/ListTest.java其中 libs 目录中存放了 guava 的 JAR 包。接下来创建一个 MANIFEST.MF 文件，内容如下：Manifest-Version: 1.0 Main-Class: guava.list.test.ListTest Class-Path: libs/guava-28.2-jre.jar各字段的含义如下：Manifest-Version：清单文件的版本，默认为 1.0。Main-Class：程序的入口，即包含 main 函数的类。Class-Path：可执行 JAR 包依赖的包的路径。此时目录结构如下：最后使用 jar 命令来生成可执行 JAR 包：jar -cvfm jartest.jar MANIFEST.MF guava libsjar 是 JDK 自带的命令，各个参数的含义如下：c：创建新档案。v：在标准输出中输出详细信息。f：指定档案文件名。m：指定清单文件，即指定我们的 MANIFEST.MF。如果没有这个参数，会生成一个默认的 MANIFEST.MF 文件。jartest.jar：指定生成 JAR 包的名称。MANIFEST.MF：指定清单文件。guava libs：指定要打包的文件。最终输出一个可执行 JAR 包：jartest.jar。这样就可以运行这个可执行 JAR 包：> java -jar jartest.jar [1, 2, 3]解压 jartest.jar 来查看目录结构：可以发现，jar 命令根据 MANIFEST.MF 文件的描述，将我们自己的类、第三方依赖类都打包进了这个可执行 JAR 包，并且新建了一个 META-INF 目录来存放 MANIFEST.MF 文件。maven 生成普通的可执行 jar 包在日常开发中，我们不会手动维护依赖包，更不会手动编写 MANIFEST.MF 描述文件，而是会使用 Maven 这样的工具来维护整个工程。使用 Maven 生成可执行 JAR 包的原理与上文手动创建是一致的：需要一个 META-INF/MANIFEST.MF 文件来指定入口函数，以及依赖包的位置。能够在指定依赖包的位置找到依赖包。如果直接使用 mvn package 命令对项目进行打包，是无法生成一个可执行 JAR 包的。原因是这样生成的 JAR 包，其 META-INF/MANIFEST.MF 文件中没有指定 Main-Class 以及 Class-Path，因此 Java 虚拟机在加载 JAR 包后找不到入口函数以及依赖的包。我们需要使用 Maven 插件来生成可执行的 JAR 包，主要有以下几种方法。使用 maven-jar-plugin 和 maven-dependency-plugin 插件在 pom.xml 中配置：<build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-jar-plugin</artifa…

spring boot内嵌tomcat访问日志常用配置
type: item
date: 2026-07-09T04:37:06+00:00
description: # tomcat access log config server: tomcat: accesslog: enabled: true #是否开启日志 directory: /tmp/accesslogs/mobile-site #日志存储目录 pattern: '%t %a %A %m %U%q %s %D %I %B' #日志格式 prefix: access #日志文件前缀 rename-on-rotate: true #是否启用日志轮转pattern的配置：%a - Remote IP address，远程ip地址，注意不一定是原始ip地址，中间可能经过nginx等的转发%A - Local IP address，本地ip%b - Bytes sent, excluding HTTP headers, or ‘-’ if no bytes were sent%B - Bytes sent, excluding HTTP headers%h - Remote host name (or IP address if enableLookups for the connector is false.html)，远程主机名称(如果resolveHosts为false则展示IP.html)%H - Request protocol，请求协议%l - Remote logical username from identd (always returns ‘-’.html)%m - Request method，请求方法（GET，POST）%p - Local port，接受请求的本地端口%q - Query string (prepended with a ‘?’ if it exists, otherwise an empty string%r - First line of the request，HTTP请求的第一行（包括请求方法，请求的URI）%s - HTTP status code of the response，HTTP的响应代码，如：200,404%S - User session ID%t - Date and time, in Common Log Format format，日期和时间，Common Log Format格式%u - Remote user that was authenticated%U - Requested URL path%v - Local server name%D - Time taken to process the request, in millis，处理请求的时间，单位毫秒%T - Time taken to process the request, in seconds，处理请求的时间，单位秒%I - current Request thread name (can compare later with stacktraces.html)，当前请求的线程名，可以和打印的log对比查找问题

HiClaw 多代理协作开发实战：用 AI 管理 AI 团队
type: item
date: 2026-07-09T04:33:44+00:00
description: 📖 前言你是否想过，让 AI 来管理 AI 团队，完成一个完整的软件开发项目？这不是科幻，而是我们正在实践的现实。今天，我将带你见证一个完整的开发过程：使用 HiClaw 多代理协作系统，从零开始开发一套通用权限管理系统。🎯 项目背景为什么是权限管理系统？权限管理系统是企业级应用的核心基础设施，几乎每个系统都需要。它的特点：✅ 业务逻辑清晰 - RBAC 模型成熟，易于理解✅ 技术栈完整 - 涵盖前后端、数据库、安全认证✅ 复杂度适中 - 适合展示多代理协作能力✅ 实用性强 - 开发完成后可直接使用技术选型前端：React 18 + Ant Design 5 + TypeScript 后端：Spring Boot 3 + Spring Security + MyBatis Plus 数据库：MySQL 8.0 开发原则：TDD（测试驱动开发）+ 小步迭代🤖 HiClaw 多代理协作系统什么是 HiClaw？HiClaw 是一个AI 代理协作管理平台，核心思想是：让 AI 管理 AI，人类只需要做决策和验收系统架构┌─────────────────────────────────────────────────┐ │ 人类管理员 (David.html) │ │ 决策、验收、配置规则 │ └─────────────────┬───────────────────────────────┘ │ ▼ ┌─────────────────────────────────────────────────┐ │ Manager Agent (我.html) │ │ 协调 Worker、分配任务、跟踪进度、质量把关 │ └─────────────────┬───────────────────────────────┘ │ ┌─────────┼─────────┬──────────┐ ▼ ▼ ▼ ▼ ┌────────┐ ┌────────┐ ┌────────┐ ┌────────┐ │Backend │ │Frontend│ │Architect│ │ QA │ │ Worker │ │ Worker │ │ Worker │ │Worker │ └────────┘ └────────┘ └─────────┘ └────────┘角色分工角色职责技能Manager Agent协调整个项目，分配任务，跟踪进度，质量把关项目管理、沟通协调System Architect系统设计、数据库设计、API 规范、技术选型架构设计、MySQLBackend DeveloperSpring Boot 后端开发、数据库实现、API 开发Java、Spring Boot、MySQLFrontend DeveloperReact 前端开发、UI 实现、交互设计React、Ant Design、TSQA Tester测试用例设计、自动化测试、质量保障JUnit、Jest、API 测试🚀 实战开始：从零到一Step 1: 需求确认人类管理员 David 提出需求：帮我开发一套通用权限管理系统核心功能：用户管理角色管理（RBAC）权限/资源管理菜单/按钮级权限数据权限（行级）组织/部门管理审计日志技术约束：前端：React + Ant Design后端：Spring Boot 3数据库：MySQLStep 2: 创建 Worker 团队Manager 开始组建专业团队：# 创建后端开发 Worker create-worker --name backend-dev \ --skills java,spring-boot,mysql,rbac # 创建前端开发 Worker create-worker --name frontend-dev \ --skills react,antd,typescript # 创建系统架构 Worker create-worker --name system-architect \ --skills architecture,design,mysql # 创建测试 Worker create-worker --name qa-tester \ --skills testing,junit,jest,api-testing每个 Worker 都是独立的 AI 代理，拥有：独立的 Matrix 账号（用于沟通）独立的容器环境（用于开发）专业技能配置独立的 MinIO 存储空间Step 3: 制定开发规则David 设定开发原则：规则 1：TDD 原则所有功能开发遵循 Red-Green-Refactor 流程规则 2：小步迭代大系统拆分为小迭代，每迭代可独立验证Manager 将这些规则同步给所有 Worker，并更新项目…

spring boot内嵌tomcat访问日志常用配置
type: item
date: 2026-07-09T04:32:52+00:00
description: Spring Boot 内嵌 Tomcat 访问日志常用配置在 Spring Boot 应用中，可以通过配置内嵌 Tomcat 的 Access Log Valve 来记录 HTTP 访问日志。以下是常用配置示例及日志格式 Pattern 的详细说明。配置示例以下 YAML 配置展示了如何启用访问日志、指定存储目录及定义日志格式：server: tomcat: accesslog: enabled: true # 是否开启日志 directory: /tmp/accesslogs/mobile-site # 日志存储目录 pattern: '%t %a %A %m %U%q %s %D %I %B' # 日志格式 prefix: access # 日志文件前缀 rename-on-rotate: true # 是否启用日志轮转Pattern 配置说明Tomcat 访问日志支持多种占位符变量，用于记录请求的不同维度信息。常用变量对照表如下：变量英文含义中文说明%aRemote IP address远程 IP 地址（注意：经过 Nginx 等转发可能不是原始 IP）%ALocal IP address本地 IP 地址%bBytes sent (or '-'.html)发送字节数，不含 HTTP 头；若为 0 则显示 -%BBytes sent发送字节数，不含 HTTP 头%hRemote host name远程主机名称（若 resolveHosts 为 false 则显示 IP）%HRequest protocol请求协议（如 HTTP/1.1）%lRemote logical username远程逻辑用户名（通常返回 -）%mRequest method请求方法（如 GET, POST）%pLocal port接受请求的本地端口%qQuery string查询字符串（若存在则前缀 ?，否则为空）%rFirst line of the requestHTTP 请求的第一行（包含方法、URI 等）%sHTTP status codeHTTP 响应状态码（如 200, 404）%SUser session ID用户 Session ID%tDate and time日期和时间（Common Log Format 格式）%uRemote user经过认证远程用户%URequested URL path请求的 URL 路径%vLocal server name本地服务器名称%DTime taken (millis.html)处理请求的时间，单位毫秒%TTime taken (seconds.html)处理请求的时间，单位秒%IRequest thread name当前请求线程名（可用于与堆栈日志对比排查问题）说明版本兼容性：上述配置属性 server.tomcat.accesslog.* 适用于 Spring Boot 2.x 及 3.x 版本。在 Spring Boot 2.4 之前，部分属性可能使用 server.tomcat.access-log-enabled 等形式。IP 地址获取：若应用部署在反向代理（如 Nginx）之后，%a 获取的可能是代理服务器的 IP。如需获取客户端真实 IP，通常需配合 server.use-forward-headers 配置或自定义 Filter 处理。

2025 Mac电脑Jdk,Maven,Idea的安装与配置,Spring boot项目创建
type: item
date: 2026-07-09T04:32:52+00:00
description: 2025 Mac 电脑 JDK、Maven、IDEA 的安装与配置及 Spring Boot 项目创建目录JDK 安装与配置Maven 安装与配置IDEA 安装与配置Spring Boot 项目创建与运行JDK 安装与配置JDK 版本选择建议在选择 JDK（Java Development Kit）版本时，建议考虑以下因素：稳定性：优先选择经过广泛验证的稳定版本，如 JDK 8、JDK 11 或 JDK 17。兼容性：根据项目实际需求选择，确保与所使用的框架及第三方库兼容。新特性需求：若项目需要使用 Java 新引入的特性，可选择较新的版本（如 JDK 17 或更高）。安装步骤下载 JDK 安装包访问 Oracle 官网 或 Adoptium 等开源社区，下载对应 macOS 版本的 JDK 安装包。安装 JDK双击下载的安装包（.dmg 或 .pkg），按照提示完成安装过程。配置环境变量打开终端（Terminal），进入用户主目录，编辑配置文件。对于 macOS Catalina (10.15) 及更高版本，默认使用 zsh，编辑 ~/.zshrc。对于旧版本系统，可能使用 ~/.bash_profile。添加以下配置（请将 <version> 替换为实际安装的版本号）：export JAVA_HOME=/Library/Java/JavaVirtualMachines/jdk<version>.jdk/Contents/Home export PATH=$JAVA_HOME/bin:$PATH保存并关闭文件，然后在终端中执行以下命令使配置生效：source ~/.zshrc # 或者 source ~/.bash_profile验证安装在终端中输入以下命令，查看 Java 版本信息以确认安装成功：java -version javac -versionMaven 安装与配置Maven 简介及作用Maven 是一个自动化构建工具，主要用于 Java 项目。它能够自动化处理构建、依赖管理等任务。其核心特性包括依赖管理、构建生命周期、插件机制等，使得项目构建更加灵活和高效。安装步骤下载 Maven 安装包前往 Maven 官方网站，下载最新稳定版本的 Maven 二进制压缩包（Binary zip archive）。解压安装包将下载的安装包解压到指定目录，例如 /usr/local/maven。在终端中执行：unzip ~/Downloads/apache-maven-3.9.9-bin.zip sudo mv apache-maven-3.9.9 /usr/local/maven配置环境变量编辑系统环境变量配置文件（如 ~/.zshrc 或 ~/.bash_profile），添加 Maven 的 bin 目录到 PATH 环境变量中：export PATH=/usr/local/maven/bin:$PATH保存后执行 source ~/.zshrc 使配置生效。验证安装在终端中输入以下命令，查看 Maven 版本信息及相关配置：mvn -vMaven 仓库设置与优化建议Maven 仓库用于存储项目所需的依赖库及插件，包括本地仓库和远程仓库。本地仓库：在 Maven 的配置文件 settings.xml 中可设置本地仓库路径，用于存储下载的依赖库及插件。优化建议：定期清理本地仓库中不再使用的依赖库，以减少存储空间占用；根据项目需求，合理配置远程仓库（如配置国内镜像），以提高依赖下载速度。IDEA 安装与配置IDEA 简介及版本选择IntelliJ IDEA 是一款强大的集成开发环境（IDE），支持众多编程语言和框架，广泛应用于 Java 开发领域。IDEA 提供社区版（Community Edition）和旗舰版（Ultimate Edition），请根据个人或团队需求选择合适的版本。安装步骤下载安装包访问 IDEA 官方网站，下载对应版本的安装包。安装过程双击安装包，按照提示完成安装。安装过程中可选择自定义安装路径和组件。首次启动与基本设置安装完成后，双击 IDEA 图标启动程序。根据个人喜好，设置主题、字体、编码等基本参数。插件市场IDEA 支持丰富的插件扩展，可通过插件市场搜索并安装所需插件。推荐插件如 Lombok、Maven Integration、Spring 相关插件等，可提升开发效率和便利性。Spring Boot 项目创建与运行Spring Boot 框架简介Spring Boot 是一个开源的 Java Web 框架，旨在简化 Spring 应用的初始搭建以及开发过程。它提供了大量常用的非业务性功能，如配置管理、安全控制、日志记录等，帮助开发者快速构建稳定、可靠的应用。创建 Spring Boot 项目准备…

Spring Boot Actuator
type: item
date: 2026-07-09T04:32:12+00:00
description: 1. 概述在本文中，我们将介绍 Spring Boot Actuator。我们将首先介绍基础知识，然后详细讨论 Spring Boot 2.x 和 1.x 中的可用内容。我们将学习如何利用响应式编程模型（Reactive Programming Model）在 Spring Boot 2.x 和 WebFlux 中使用、配置和扩展此监视工具。随后，我们将讨论如何在 Boot 1.x 中执行相同的操作。自 2014 年 4 月起，Spring Boot Actuator 随 Spring Boot 一起发布。随着 Spring Boot 2 的推出，Actuator 进行了重新设计，并添加了新的令人兴奋的 Endpoint。我们将本指南分为三个主要部分：什么是 Actuator？Spring Boot 2.x ActuatorSpring Boot 1.x Actuator2. 什么是 Actuator？本质上，Actuator 为我们的应用带来了生产就绪功能。监视应用程序、收集指标、了解流量或数据库状态对于这种依赖性变得微不足道。该库的主要好处是，我们可以获得生产级工具，而不必自己真正实现这些功能。Actuator 主要用于公开有关正在运行的应用程序的操作信息——健康状态、指标、信息、转储、环境等。它使用 HTTP Endpoint 或 JMX Bean 使我们能够与其交互。一旦此依赖关系位于类路径上，便可以立即使用几个 Endpoint。与大多数 Spring 模块一样，我们可以通过多种方式轻松地对其进行配置或扩展。2.1. 入门要启用 Spring Boot Actuator，我们只需要将 spring-boot-actuator 依赖项添加到我们的包管理器中即可。在 Maven 中：<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-actuator</artifactId> </dependency>请注意，这与 Boot 版本无关，因为 Spring Boot 材料清单 (BOM.html) 中已指定版本。3. Spring Boot 2.x Actuator在 2.x 中，Actuator 保留了其基本意图，但简化了其模型，扩展了其功能并合并了更好的默认设置。首先，该版本与技术无关。此外，它通过与应用程序合并来简化其安全模型。最后，在各种更改中，请务必记住其中一些正在中断。这包括 HTTP 请求和响应以及 Java API。此外，与旧的读/写模型相比，最新版本现在支持 CRUD 模型。3.1. 技术支持在第二个主要版本中，Actuator 现在与技术无关，而在 1.x 中，它与 MVC 关联，因此与 Servlet API 关联。在 2.x 中，Actuator 定义了其模型，可插入且可扩展，而无需依赖 MVC。因此，通过这种新模型，我们能够利用 MVC 和 WebFlux 作为基础 Web 技术。而且，可以通过实现正确的适配器来添加即将到来的技术。最后，仍然支持 JMX 公开 Endpoint，而无需任何其他代码。3.2. 重要变化与以前的版本不同，Actuator 禁用了大多数 Endpoint。因此，默认情况下唯一可用的两个是 /health 和 /info。如果要启用所有这些功能，可以设置 management.endpoints.web.exposure.include=*。或者，我们可以列出应启用的 Endpoint。现在，Actuator 与常规 App 安全规则共享安全配置。因此，极大地简化了安全模型。因此，要调整 Actuator 安全性规则，我们可以为 /actuator/** 添加一个条目：@Bean public SecurityWebFilterChain securityWebFilterChain( ServerHttpSecurity http) { return http.authorizeExchange() .pathMatchers("/actuator/**".html).permitAll() .anyExchange().authenticated() .and().build(); }我们可以在 全新的 Actuator 官方文档中 找到更多详细信息。另外，默认情况下，所有 Actuator Endpoint 现在都放在 /actuator 路径下。与以前的版本相同，我们可以使用新的属性 management.endpoints.web.base-path 来调整此路径。3.3. 预定义 Endpoint让我们看一下一些可用的 Endpoint…