资讯详情

资讯详情

让 Claude Code 生成高效生产级代码 · 终极完整指南:CLAUDE.md 配置与 Prompt 骨架

1. 为什么你的 Claude Code 总在写“能跑但不敢上线”的代码如果你用 Claude Code 写过 JDK17 SpringBoot 的业务代码大概率遇到过这种场面接口能跑通单元测试也过了但一 review 就发现循环里查数据库、事务包了一大圈、日志用加号拼接、集合不指定容量、select *满天飞。代码不是不能用而是不敢直接上线。问题不在模型能力而在约束方式。Claude Code 默认会“讨好”你的即时需求你说写个查询它就给你一个最直白的 for 循环加getById你说加个校验它就叠三层 if。它不知道你项目里已经有Result、BizException、PageUtils也不知道你的 MySQL 表有索引规范。没有规则锁死它就会按“通用示例代码”的惯性输出。这篇要解决的就是这件事用一份可复制的CLAUDE.md把生产级规范固化到项目根目录再用settings.json和 Prompt 骨架把每次生成的输入约束住最后给出可编译、可运行的验证动作。适合正在用 Claude Code 做 Java 后端、又想把 AI 产出拉到“资深工程师手写”水平的同学。下面所有配置我都按 JDK17 SpringBoot3.x MyBatis-Plus 的栈来写你可以直接改包名套用。2. 前置准备把 TaoToken 接入 Claude Code 的配置位置Claude Code 本身是一个命令行编码代理它需要一个可用的模型服务端点。我这边习惯用 TaoToken 来做统一接入原因是它的 API 兼容 Anthropic 的调用格式配置到 Claude Code 里比较顺。你需要先拿到一个 API Key然后把它写进环境变量或配置文件。先明确两个地址后面配置里会用到官网入口https://taotoken.net/?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_contentAPI 基址https://taotoken.net/api拿 Key 的路径是控制台里的 API Keys 页面登录后新建一个 Key复制出来。注意 Key 只显示一次丢了就重建。如果你还没账号从官网进控制台即可。Claude Code 读取配置的方式有两种环境变量和项目级settings.json。环境变量适合本机全局settings.json适合跟着项目走、团队共享。我建议两个都配环境变量放 Keysettings.json放模型和权限策略这样 Key 不进 Git 仓库。环境变量这样设Linux/macOSexport ANTHROPIC_BASE_URLhttps://taotoken.net/api export ANTHROPIC_API_KEYsk-你的KeyWindows PowerShell$env:ANTHROPIC_BASE_URLhttps://taotoken.net/api $env:ANTHROPIC_API_KEYsk-你的Key设完执行echo $ANTHROPIC_BASE_URL确认生效。这一步不做后面 Claude Code 启动时会直接报鉴权失败别急着怀疑 Key 有问题先看环境变量有没有被当前 shell 读到。3. 可复制配置CLAUDE.md 与 settings.json 骨架3.1 项目根目录的 CLAUDE.mdCLAUDE.md放在项目根目录Claude Code 每次会话启动会自动读取相当于给 AI 的“项目宪法”。下面这份是我实测下来约束力比较强的一版按你的实际包名替换com.yourcompany即可。# 项目 AI 编码规范生产级 ## 技术栈锁定 - JDK17 / SpringBoot3.x / MyBatis-Plus3.5 / MySQL8 - 分层controller / service / impl / mapper / entity / dto / vo / common / config / exception / util - 禁止引入 JDK8 废弃写法优先 record、var、switch 表达式、Stream ## 代码极简 1. 禁止冗余变量、无效判断、空代码块、废话注释 2. 禁止多层 if 嵌套与重复判空参数校验交给 Validated 3. 方法单一职责单方法不超过 50 行单类不超过 500 行 4. 必须复用项目已有 Result / BizException / 工具类 / 常量禁止造轮子 ## 数据库性能 1. 严禁 N1禁止循环 getById、循环远程调用 2. 禁止 select *必须指定字段 3. 批量操作使用 saveBatch / updateBatchById / selectBatchIds 4. 模糊查询只允许右模糊禁止 %xxx% 5. 禁止字段函数运算与隐式类型转换保证索引生效 6. 大数据量必须分页或分批禁止全表扫描 ## 事务与并发 1. 查询方法禁止加 Transactional 2. 写操作事务范围最小化禁止大事务、长事务 3. 禁止事务失效场景内部调用、非 public、异常被吞 4. 共享变量必须线程安全禁止手动 new Thread ## 集合与 GC 1. 集合初始化指定预估容量 2. 判空统一用 CollectionUtils禁止 size() 0 3. 减少临时对象与中间集合 4. 日志统一 {} 占位符禁止字符串拼接 ## 资源与安全 1. IO、流、连接必须自动关闭优先 try-with-resources 2. 线程统一走项目线程池 3. 禁止明文打印密码、手机号、身份证 4. 禁止硬编码密钥、魔法值统一抽常量 ## 工程红线 1. 严格遵循现有包结构禁止私自新建一级包 2. 禁止擅自新增配置类、拦截器、全局 Bean 3. 禁止私自修改 pom 依赖、版本、引入陌生三方包 4. 只增量开发禁止删除、覆写、重构原有业务代码 ## 生成要求 所有代码必须高性能、极简、可维护、无冗余、生产级可用。这份文件的关键在于“禁止”写得足够具体。你写“注意性能”AI 会忽略你写“禁止循环 getById批量用 selectBatchIds”它才会真的换写法。3.2 settings.json 骨架settings.json放在项目.claude/目录下用来控制权限和模型行为。下面这份骨架把危险操作挡在外面同时允许常规读写。{ model: claude-sonnet-4-20250514, permissions: { allow: [ Read, Glob, Grep, Edit, Write ], deny: [ Bash(rm -rf:*), Bash(git push:*), Bash(mvn deploy:*), Read(./.env), Read(./**/application-prod.yml) ] }, env: { ANTHROPIC_BASE_URL: https://taotoken.net/api } }deny里挡掉git push和mvn deploy是防止 AI 在你不注意时把半成品推上去挡掉生产配置文件是防止敏感信息进入上下文。env里写基址Key 仍然走环境变量避免提交到仓库。3.3 Prompt 骨架模板每次让 Claude Code 生成代码前把下面这段贴在需求前面。它和CLAUDE.md是互补关系CLAUDE.md是长期约束Prompt 是本次任务的即时指令。严格遵守项目 CLAUDE.md 规范生成生产级代码 1. 代码极简去除冗余判断、无效变量、废话注释 2. 禁止 N1、循环查库、select *、大事务 3. 判空精简不做过度防御嵌套 4. 复用项目已有 Result、BizException、工具类、常量 5. DB 操作优先批量与 LambdaWrapper 6. 查询不加事务写操作事务最小化 7. GC 友好、资源安全、日志用 {} 占位符 8. 输出可直接编译运行的完整代码不要省略 import第 8 条很重要。默认情况下 AI 喜欢用// ... 省略来偷懒明确要求“不要省略 import”能省掉大量补全工作。4. 验证请求确认生成代码可编译、可运行配置写完不代表生效得用一次真实请求验证。我一般分三步先验证模型连通再验证生成代码能编译最后验证能跑起来。4.1 验证模型连通在项目根目录启动 Claude Code输入一句最简单的指令读取 CLAUDE.md然后用一句话总结本项目禁止的三种数据库写法。如果它准确说出“禁止 N1、禁止 select *、禁止循环单条批量操作”说明CLAUDE.md已经被读到。如果它答得含糊检查文件是不是放在了项目根目录、文件名大小写是否正确。4.2 验证生成代码可编译给一个具体需求让它生成一个带分页的查询接口在 UserController 新增分页查询接口按用户名右模糊搜索返回 PageResultUserVO。 遵守 CLAUDE.md复用现有 Result 和 PageUtils。生成后先看三件事有没有select *、有没有在循环里查库、事务注解有没有加在查询方法上。确认没问题后执行编译mvn -q clean compile编译通过说明 import、泛型、依赖引用都没问题。如果报cannot find symbol大概率是它引用了不存在的工具类这时候把项目里真实的工具类路径贴给它让它改。4.3 验证可运行编译过了还要跑起来。启动应用mvn spring-boot:run然后用 curl 打一下接口curl -X GET http://localhost:8080/user/page?usernamezhangpageNum1pageSize10 \ -H Content-Type: application/json返回结构里应该有code、data、total字段。如果返回 500看日志里有没有BadSqlGrammarException通常是字段名拼错或表名不对。这一步能过说明生成的代码不只是“看起来对”而是真的能跑。5. 本篇常见错排查5.1 CLAUDE.md 不生效最常见的原因是文件位置不对。Claude Code 只读项目根目录的CLAUDE.md放在src/或.claude/下都不会自动加载。另一个原因是会话已经启动后才创建文件需要重启会话。你可以用/memory命令查看当前加载了哪些记忆文件。5.2 仍然生成 select *如果CLAUDE.md写了禁止但 AI 还是写select *检查你的 Prompt 里有没有明确说“指定字段”。有时候 AI 会优先服从即时指令即时指令模糊时它才回退到默认习惯。把 Prompt 里的“DB 操作优先批量与 LambdaWrapper”改成“查询必须用 LambdaQueryWrapper.select() 指定字段”约束力会更强。5.3 事务注解加错位置AI 经常把Transactional加在查询方法上。排查时全局搜Transactional逐个确认查询方法有没有加、写方法范围是不是过大、有没有内部调用导致失效。发现后直接在 Prompt 里补一句“查询方法禁止 Transactional”让它重写。5.4 私自新增依赖这是高危项。AI 遇到不认识的工具类时可能直接往pom.xml里加依赖。排查方式是每次生成后执行git diff pom.xml只要有变更就人工确认。更彻底的做法是在settings.json的deny里加上Edit(./pom.xml)让它改不了只能提示你手动加。5.5 编译报找不到符号通常是 AI 引用了项目里不存在的类或者包名写错。把项目真实的目录结构贴给它执行 tree -L 3 src/main/java 后把结果贴进对话让它基于真实结构重新生成。这一步比反复猜包名高效得多。5.6 接口返回字段缺失如果UserVO里字段没返回检查是不是用了select *但实体字段和 VO 对不上或者 MyBatis-Plus 的TableField没配。让 AI 对照实体和 VO 逐字段核对比你自己一个个查快。6. 把约束变成习惯长期编码与 Agent 场景的接入方式配置和 Prompt 都跑通之后真正决定代码质量稳定性的其实是会话策略。我的做法是单模块单会话一个业务模块开发完就/clear重置上下文避免长会话里规范被稀释。每次新会话先让它读CLAUDE.md和现有工具类再开始写代码。如果你打算把 Claude Code 长期用在日常编码和 Agent 任务上建议走 Coding Plan 这条线配合 API Keys 和接入文档把环境固定下来。验证模型行为时可以用模型对话快速试 Prompt确认约束生效后再进项目。相关入口长期编码 / Agent 场景https://taotoken.net/coding-plan?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_content获取 API Keyhttps://taotoken.net/api-keys?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_content接入文档https://taotoken.net/doc?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_content模型对话验证https://taotoken.net/console?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_content最后补一个我踩过的坑CLAUDE.md不要写太长。超过一定长度后AI 对后半部分的注意力会下降规范约束力反而变弱。把最关键的“数据库性能”和“工程红线”放在前三分之一效果最好。
觉得有用,分享给同行:

为您的企业打造数字门面

稳重轻奢商务风格,端正雅致视觉,长效耐看不易过时。

立即咨询 →