1. Java 后端接入 Claude Code 的真实起点
Claude Code 是 Anthropic 推出的命令行 AI 编程工具,能直接读取项目源码、跨文件改写、执行终端命令,适合已经有一定工程规范的 Java 后端团队。它不是补全插件,而是一个能理解整个仓库上下文的"结对工程师"。我所在的团队做的是 Spring Boot 3.2 + MyBatis-Plus + MySQL 8 的中台服务,模块大概 40 多个,之前用网页版 AI 最大的痛点是每次都要手动粘贴代码、粘贴报错、粘贴表结构,来回切换浏览器和 IDEA,思路被打断得很碎。
真正让我决定把它接进日常开发流的,是一次跨 6 个文件的字段重命名:Controller、Service、Mapper、XML、DTO、VO 全都要改,漏一个就编译不过。当时我试着让 Claude Code 直接读项目,它一次性给出了所有改动点,还顺手把 Swagger 注解同步了。从那次之后,我开始认真研究 CLAUDE.md 和 MCP 这两块,因为它们决定了这个工具是"玩具"还是"工程化组件"。这篇就把我踩过的坑和能直接复制的配置写清楚,帮你判断值不值得引入团队。
2. 前置准备:TaoToken 接入与 Claude Code 安装
Claude Code 本身是命令行工具,但模型调用需要走一个稳定的 API 入口。我这边用的是 TaoToken 提供的接入方式,官网在 https://taotoken.net/?utm_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite&utm_content= ,API 地址是 https://taotoken.net/api 。它的作用是给 Claude Code 提供一个兼容 Anthropic 协议的调用端点,省去自己折腾网络和鉴权的部分。
安装 Claude Code 的前提是 Node.js 18 以上。先确认环境:
node -v npm -v然后全局安装:
npm install -g @anthropic-ai/claude-code安装完成后不要急着跑,先配置环境变量。Claude Code 读取的是ANTHROPIC_BASE_URL和ANTHROPIC_API_KEY这两个变量。API Key 需要到控制台生成,地址是 https://taotoken.net/console/api-keys?utm_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite&utm_content= 。生成后写入 shell 配置:
export ANTHROPIC_BASE_URL="https://taotoken.net/api" export ANTHROPIC_API_KEY="sk-你的key"Windows 用户可以在系统环境变量里加,或者用 PowerShell 的$env:语法临时设置。配好后执行claude --version,能打印版本号就说明命令行通了。这一步如果报 401,八成是 Key 没生效或者复制时带了空格,重新source ~/.zshrc再试。
3. 可复制配置:CLAUDE.md 骨架与 MCP 接入
3.1 CLAUDE.md 到底写什么
CLAUDE.md 放在项目根目录,Claude Code 每次启动会自动读取。它不是给 AI 看的"说明书",而是给 AI 划的"项目边界"。我见过太多人把它写成 README 的复制品,结果 AI 还是乱写。核心是写那些"AI 猜不到、但你必须遵守"的约定。
下面是我在用的骨架,可以直接改:
# 项目约定 ## 技术栈 - JDK 17,Spring Boot 3.2.x,MyBatis-Plus 3.5.x - MySQL 8.0,Redis 7,RocketMQ 5 - 构建工具:Maven 3.9,禁止混用 Gradle ## 分层规范 - Controller 只做参数校验和响应包装,禁止写业务逻辑 - Service 接口与实现分离,实现类以 Impl 结尾 - Mapper 继承 BaseMapper,复杂 SQL 写在 XML - DTO/VO 放在 api 模块,实体放在 domain 模块 ## 命名约定 - 接口路径统一 /api/v1/ 前缀 - 数据库字段下划线,Java 字段驼峰 - 异常统一抛 BizException,错误码在 ErrorCode 枚举 ## 硬性约束 - 修改公共接口后必须同步更新 Swagger 注解 - 新增字段必须同步更新对应的 XML resultMap - 禁止在 Controller 直接注入 Mapper - 单元测试用 JUnit 5 + Mockito,覆盖率不低于 60% ## 常用命令 - 编译:mvn clean compile -DskipTests - 单测:mvn test -Dtest=类名 - 启动:mvn spring-boot:run -Dspring-boot.run.profiles=dev写完之后,你可以在对话里直接说"参照 UserController 的模式写一个 OrderController",它会自动套用上面的分层和命名。实测下来,有了这个文件,生成代码的返工率能降一半以上。
3.2 MCP 配置片段
MCP(Model Context Protocol)是 Claude Code 扩展外部能力的机制。我主要用它接 GitHub,这样提交、建 PR 不用切终端。配置文件在~/.claude.json或者项目级.mcp.json,我放在项目级方便团队共享:
{ "mcpServers": { "github": { "command": "npx", "args": ["-y", "@modelcontextprotocol/server-github"], "env": { "GITHUB_PERSONAL_ACCESS_TOKEN": "ghp_你的token" } } } }Token 在 GitHub 的 Settings → Developer settings → Personal access tokens 生成,勾选 repo 和 pull_request 权限即可。配好后重启 Claude Code,输入/mcp能看到 github 服务状态为 connected 就成功了。
注意:MCP 的 token 不要提交到仓库,
.mcp.json记得加进.gitignore,团队共享时用环境变量注入。
4. 验证请求:一次完整的端到端动作
配置写完必须验证,不然你不知道是 CLAUDE.md 没生效还是 MCP 没连上。我用的验证动作是"新增一个带分页的查询接口",因为它会同时触发分层规范、XML 映射、Swagger 注解三个约束点。
第一步,进入项目目录启动:
cd ~/projects/order-service claude第二步,在交互界面输入指令:
参照 UserController 的分页查询模式,为 Order 模块新增一个按状态和创建时间范围查询的分页接口。 要求: 1. 路径 /api/v1/orders/page 2. 入参 OrderPageQuery,包含 status、startTime、endTime、pageNum、pageSize 3. 返回统一包装 Result<PageResult<OrderVO>> 4. 同步更新 Swagger 注解和 XML resultMap第三步,观察它的行为。正常情况下它会先列出要改的文件清单,等你确认后再逐个生成。如果它直接开始写代码而没列清单,说明 CLAUDE.md 里的约束没被读到,检查文件是不是放在了项目根目录。
第四步,生成完成后执行编译:
mvn clean compile -DskipTests编译通过后启动服务,用 curl 验证:
curl -X POST "http://localhost:8080/api/v1/orders/page" \ -H "Content-Type: application/json" \ -d '{"status":1,"pageNum":1,"pageSize":10}'返回结构里能看到code、message、data.records三个字段,且 records 里的字段名和 OrderVO 一致,就说明整条链路通了。我实测这套动作从指令到验证通过大概 4 分钟,手工写的话光 XML 和 Swagger 就得十几分钟。
5. 本篇常见错排查
5.1 CLAUDE.md 不生效
最常见的原因是文件位置不对。它必须在项目根目录,也就是你执行claude命令的那个目录。如果你在子模块里启动,它读的是子模块的 CLAUDE.md。另一个原因是文件名大小写,必须是全大写CLAUDE.md,写成claude.md在 Linux 上不识别。
5.2 MCP 连接失败
先看/mcp的输出。如果是failed to connect,多半是 npx 拉包失败,手动跑一次npx -y @modelcontextprotocol/server-github看报错。如果是 401,检查 token 是否过期或权限不足。还有一点,MCP 服务启动有延迟,刚配好立刻查可能显示 connecting,等几秒再试。
5.3 生成代码不符合分层规范
如果 AI 把业务逻辑写进了 Controller,说明 CLAUDE.md 里的约束写得太模糊。把"Controller 只做参数校验"改成"Controller 禁止出现 if 以外的业务判断,禁止直接调用 Mapper",约束越具体,遵守率越高。另外可以在指令里加一句"违反分层规范的代码不要生成",双重保险。
5.4 编译报错反复出现
有时候 AI 改了一个文件但漏了关联文件,导致编译不过。这时候不要让它盲目重试,把完整报错贴回去,并加一句"先分析根因再改,不要直接改代码"。我遇到过一次 MyBatis 的Invalid bound statement,它一开始想改 Mapper 接口,后来分析出是 XML 的 namespace 写错了,定位准了才动手。
5.5 上下文丢失
长对话后 AI 会忘记前面的约定。用/compact压缩上下文,或者用/resume保存会话。重要节点手动在对话里重申关键约束,比如"记住,所有新增接口都要走 Result 包装"。
6. 接入方式选择与后续动作
验证通过之后,接下来就是决定用哪种方式长期跑。如果你只是偶尔验证模型效果、试试生成质量,直接用模型对话就行,地址是 https://taotoken.net/models?utm_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite&utm_content= ,不用装命令行,网页里贴代码就能问。
如果你像我一样要把它嵌进日常编码流,每天都要跨文件改代码、跑编译、提交 PR,那 Coding Plan 更合适,地址是 https://taotoken.net/coding-plan?utm_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite&utm_content= ,它针对长时间编码和 Agent 场景做了额度优化,不会写一半提示额度不够。
接入过程中如果卡在配置或报错上,先翻接入文档 https://taotoken.net/doc?utm_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite&utm_content= ,里面把环境变量、MCP、常见错误码都列了。Key 的管理在 API Keys 页面 https://taotoken.net/console/api-keys?utm_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite&utm_content= ,建议给团队每个人单独生成,方便排查是谁的调用出了问题。
最后说一句实在的:Claude Code 不会替你做架构决策,数据库怎么设计、服务怎么拆,还是得自己想清楚。但它能把"照着已有模式写代码"这件事做到接近零成本,这对 Java 后端这种模板代码密集的场景,价值是实打实的。先把 CLAUDE.md 写扎实,再谈 MCP 扩展,顺序别反了。