这是Spring Boot 应用程序的 Claude Code模板!
作者Piotr Minkowski被Claude Code的代码生成质量折磨后,决定创建一套专门针对Spring Boot的模板。他不仅分享了如何通过CLAUDE.md文件、技能系统和子代理让AI写出靠谱的企业级代码,还展示了生成一个带JWT认证、PostgreSQL和Kubernetes部署的完整应用的全过程。
该模板为 Spring Boot 应用程序提供了一个结构化的起点,并针对 Claude AI 的代码完成功能进行了优化。它包括简化开发和提高生产力的基本配置和最佳实践。
此模板背后的想法是,您可以克隆此存储库并使用它通过 Claude Code 生成您想要的应用程序。
作者:我为什么要折腾这个模板
Claude Code的官方文档里,其实有一大堆关于怎么用它生成代码的最佳实践。从理论上讲,你可以直接打开Claude Code,随便输入个提示词,然后它就噼里啪啦给你生成一堆代码。但问题是,这堆代码到底能不能用?能不能满足你的期望?这就要打个大大的问号了。
这就像是,你让一个刚学会做饭的室友去给你做一顿满汉全席。他能做出来吗?能做出来。但做出来的东西,你敢吃吗?你可能得先准备好胃药。
所以,当你开始用Claude Code的时候,大多数人都会经历一个阶段,就是满世界去找那种现成的仓库模板,最好是跟你想要生成的应用程序类型完美匹配的那种。你想啊,如果你要写一个Spring Boot应用,你肯定希望Claude Code能理解什么是Controller、什么是Service、什么是Repository,而不是给你生成一堆乱七八糟的东西。
但是,自己从头开始创建这样一个模板,那简直是要了老命了。你得花多少时间?你得试多少次错?我告诉你,我试过,那感觉就像是在黑暗中摸索,不知道哪一脚会踩到坑里。
所以我就想,我们这些专注于特定技术的社区,就应该团结起来,一起维护、改进、分享我们的模板。这对所有人都有好处,对吧?就像是一个开源项目的维护者,大家共同贡献代码,最后项目越来越好。
那问题来了,上哪儿去找这种跨各种技术的模板灵感呢?我觉得最靠谱的地方,就是在网上发帖子发得特别多的人。比如说我,写了那么多关于Spring Boot和Java的文章,我总觉得自己有责任去维护和发展这样一个模板。
你可以把这个仓库当成一个灵感来源,用它来创建你自己的模板。或者,你也可以把它当成一个即拿即用的启动包,只需要对里面的CLAUDE.md文件做一些最小的修改,就能直接用上了。这就像是给你一个已经配好的火锅底料,你只需要根据自己的口味加点料就行了。
源代码:别光看不练,你得自己动手
如果你想亲自试试这个东西到底怎么样,那就别光看不练,赶紧去把我的源代码拉下来用用看。
具体怎么做呢?很简单,你得先去克隆我的那个GitHub示例仓库。然后,你就照着我的指示一步一步来就行了。这就像是去宜家买了个家具,你得按照说明书一步一步组装,虽然过程可能有点折腾,但最后装好的那一刻,成就感爆棚。
这是当前仓库的结构,我得提前跟你说一声,这个项目还在不断开发中,所以以后可能会有变化。这就好比是装修房子,今天装个灯,明天换个窗帘,都是为了让住得更舒服。
. |
看到这个目录树,你可能会觉得有点眼花缭乱。别怕,我给你解释一下。.claude目录就是我们的核心配置文件所在的地方。agents目录里放的是各种子代理,就像是不同领域的专家,比如spring-boot-engineer就是专门写Spring Boot代码的专家。skills目录里放的是各种技能,就像是给AI准备的各种工具箱,每个工具箱里都有针对特定技术的专业知识和最佳实践。
Claude的官方推荐工作流
Claude官方其实推荐了一个非常清晰的工作流程,我觉得这个流程就像是写代码的黄金法则。
这个工作流程分为四个阶段:探索、计划、实施、提交。
你想啊,如果你要盖一栋房子,你能直接就开始砌砖吗?肯定不行,你得先勘探地形,然后画出设计图,再找工人施工,最后验收。写代码也是一样的道理,探索阶段就是了解需求,计划阶段就是设计方案,实施阶段就是写代码,提交阶段就是把代码放到仓库里。
官方说,当Claude有机会检查自己的结果时,它的工作效率会大大提高。比如说,它能自己运行测试,能比较屏幕截图,能根据预期输出验证结果。这就像是给AI装了一双眼睛,它能自己看自己写的代码对不对。
如果没有明确定义的成功标准,Claude可能会生成一些看起来正确但实际上根本不能运行的解决方案。这时候你就成了唯一能反馈问题的人,每个bug都得靠你来发现和纠正。那感觉就像是,你请了个助理,结果他干的活全得你自己再检查一遍,比你自己干还累。
在我们的模板里,我们需要创建的最重要的文件就是CLAUDE.md。这个文件就像是给Claude的一份内置简报,每次交互开始的时候,它都会先加载这个文件,看看里面都有什么规定。
你可以在这个文件里定义常见的Bash命令、编码约定、团队工作流程等等。把这些信息放在一个文件里,就能给Claude提供一个一致的上下文和指导,这些东西光靠分析代码库是没办法推断出来的。
我的CLAUDE.md文件里到底写了啥
好,现在咱们来看看我的CLAUDE.md文件到底长什么样。
这个文件里既有一些通用的设计指导,也有一些针对我的应用程序的特定元素。我觉得启用计划模式特别重要,这样在Claude Code真正开始工作之前,我就能准确地看到它打算生成什么。这就像是施工前先给你看效果图,你觉得不满意还可以改。
另一个关键步骤就是通过创建自动化测试并运行它们来验证生成的代码。这就像是给代码上了一道保险,你跑一遍测试,就知道代码是不是真的能干活了。
我还希望生成的代码尽可能简单,所以我要求Claude在生成代码的时候,要自己检查有没有过度工程化。过度工程化是什么意思呢?就是本来一个简单的功能,你非要用一堆设计模式、框架、工具把它搞得特别复杂。这就像是,你要去隔壁便利店买瓶水,结果你非得开一辆大卡车去,那不就是浪费资源吗?
第5点和第6点讲的是怎么加载和使用技能和子代理。技能是绝对必要的,没有它们,Claude就像是一个没受过专业训练的实习生,啥都不会。而子代理虽然好用,但它们会消耗大量的token,所以用之前得好好想想,别动不动就用,不然钱花得跟流水一样。
计划模式默认,让每一步都走得稳
我把计划模式设成了默认选项,对于任何不是特别简单的任务,比如超过三步或者需要做架构决策的任务,都得先进入计划模式。这就像是,你出门旅游之前,得先规划好路线,订好酒店,不然走到哪儿算哪儿,最后可能连住的地方都没有。
我用计划模式来做验证步骤,而不仅仅是用来构建代码。验证步骤很重要,你得看看你的计划是不是真的可行,有没有什么遗漏的地方。所以,我要求先提前写下详细的规格说明,这样能减少歧义。这就像是写合同,写得越清楚,后面扯皮的事情就越少。
自我提升循环,让错误越来越少
用户进行任何更正之后,我会用模式更新tasks/lessons.md这个文件。这个文件就像是我们的错题本,把每次犯的错误都记下来,下次就不会再犯了。
我还要求为自己制定规则,防止犯同样的错误。比如说,你上次忘记处理某个异常了,那就在规则里加上一条:每次写代码的时候,都要考虑异常处理。这样就能无情地迭代这些教训,直到错误率降下来。
在项目开始的时候,我还会复习之前积累的那些课程。这就像是运动员在比赛前,先看看之前的比赛录像,分析一下自己哪里做得不好,然后有针对性地改进。
完成前的验证,确保万无一失
我有个原则,在没有证明任务有效之前,绝不能把它标记为完成。这就像是,你写完了作业,但你得检查一遍,看看有没有做错的地方。
在相关的情况下,我会比较主要更改和你的更改之间的行为差异。比如说,你修改了一个函数,你得看看改完之后,它的输出和之前是不是一样的,是不是满足新的需求。
我还会问自己一个问题:“工程师会批准这个吗?”这个问题就像是给自己当面试官,你得用最严格的标准来要求自己。如果连自己都觉得过不去,那怎么能让别人满意呢?
然后就是运行测试,检查日志,证明代码的正确性。这就像是给代码做体检,每一项指标都得合格才行。
要求优雅,但不追求完美
对于重要的更改,我会暂停一下,问问自己:“有没有更优雅的方法?”这个优雅不是指代码写得好看,而是指解决方案是否简洁、高效、易于维护。
如果修复感觉很棘手,我会说:“了解我现在所知道的一切,实施优雅的解决方案。”这就是说,当问题特别复杂的时候,我更要沉住气,找一个最好的解决方案。
当然,对于简单、明显的修复,我会跳过这一步。毕竟,不是所有的事情都需要过度设计。这就像是,你饿了就吃个面包,没必要非得去米其林三星餐厅吃一顿。
在展示自己的作品之前,我会先挑战自己,看看还有没有改进的空间。这就像是,你写完了文章,先自己读一遍,改改错别字,润润色,然后再给别人看。
技能和子代理的使用
我会把技能用于任何需要能力的任务。技能就像是给Claude配备的各种专业工具,需要用哪个就调用哪个。我从.claude/skills/目录加载技能,用自然语言调用它们。每项技能都是一种独立的能力,就像是瑞士军刀上的各种小工具,各有各的用处。
至于子代理,我会自由地使用它们来保持主上下文窗口的干净。主上下文窗口就像是你的工作桌面,如果堆满了东西,你就没办法专心工作了。我把复杂的任务交给子代理去处理,这样主代理就能专注于更重要的事情。
我从.claude/agents/目录加载子代理,对于复杂的问题,我会通过子代理投入更多的计算资源。每个子代理只负责一项任务,这样它们就能在给定的技术栈上集中精力,把工作做到最好。
核心原则:简单第一,不懒惰
我们的核心原则是简单第一,这意味着每个更改都应该尽可能简单,影响最小。这就像是,你要修一堵墙,最好的办法是直接把破损的砖换掉,而不是把整堵墙都拆了重建。
另一个原则是不懒惰,这要求我们找到问题的根本原因,而不是只做临时修复。这就像是,你的车轮胎漏气了,你不能只是打打气就算了,你得找到是哪里漏了,然后补好它。
这些原则是高级开发人员的标准,也是我们要求Claude遵守的标准。
项目一般说明
接下来,我们来看看项目的一般说明,这些都是我对生成的代码的主要期望。
我会始终使用最新版本的依赖项。这就像是,你用手机,肯定希望用最新的系统,这样功能更多,安全性也更好。
我会始终把Java代码写成Spring Boot应用程序。这就像是,你写Java代码,就得用Spring Boot,因为它是当前最流行的框架,也是最成熟的。
我会始终使用Maven进行依赖管理。Maven就像是你的仓库管理员,帮你管理所有的依赖包,省得你自己手动去下载。
我会始终为生成的代码创建正面和负面的测试用例。正面测试用例测试正常情况,负面测试用例测试异常情况。这就像是,你不仅要测试汽车在平坦路面上的性能,还得测试它在崎岖山路上的表现。
我会始终在.circleci目录中生成CircleCI管道来验证代码。CircleCI就像是你的代码保镖,每次你提交代码,它都会自动运行测试,确保代码是好的。
我会尽量减少生成的代码量。代码越少,出错的概率就越低,维护起来也越容易。
Maven工件的名称必须与父目录的名称相同。这样能保证项目的结构清晰,不会让人摸不着头脑。
我对Maven项目使用语义版本控制,每次生成新版本时,都会改变版本号的PATCH部分。语义版本控制就像是给软件打标签,每次更新都有明确的标识,大家一看就知道改了啥。
我会使用pl.piomin.services作为Maven项目和基础Java包的组ID。这个组ID就像是我们的身份证,一看就知道这个项目是哪儿来的。
我不会使用Lombok库。Lombok虽然好用,但它会隐藏一些代码细节,有时候反而会增加调试的难度。
我会生成Docker Compose文件来运行应用程序使用的所有组件。Docker Compose就像是你的厨房管家,帮你把所有需要的东西都准备好,然后一键启动。
每次生成新版本时,我会更新README.md。README.md就像是项目的说明书,每次有更新,都得及时更新说明书,让别人知道新功能怎么用。
如果不想用子代理怎么办
如果你不想用子代理,你可以按照以下方式重写CLAUDE.md的第6节。这个改动强制Claude Code使用spring-boot-engineer代理,这个代理专门为Spring Boot应用程序生成代码。
# 6. 子代理的使用 |
你可以通过执行/agents命令来验证可用代理的列表。这就像是,你去看医生之前,先看看医院都有哪些科室,哪个科室的医生最擅长治你的病。
技能系统:给Claude装上了各种专业工具
在输入提示并生成代码之前,你可以用/skills命令检查已加载技能的列表。我在.claude/skills目录里定义了九个技能,每个技能都对应一个特定的领域。
这些技能的目的是通过特定应用所使用的技术的特定信息来扩展Claude的知识。这就像是,你给Claude请了一堆专家,每个专家都有自己的特长。
每个技能都应该在---括号内有一个标题部分,里面要有名称和描述标签。我们还可以在元数据标签里添加一些附加标签,比如版本号、领域、触发条件等等。
我的仓库里的技能主要与Spring、Java和JPA编码的最佳实践相关。比如说,java-architect技能就是专门处理企业Java应用的,它知道怎么用Spring Boot、微服务、反应式编程这些东西。
技能示例:Java架构师
我们来看看java-architect技能的片段。这个技能是用来处理Spring Boot、微服务或者反应式编程相关的问题的。
它的名称是java-architect,描述里说,当你在构建、配置或者调试企业Java应用程序的时候,就可以调用它。它能帮你实现WebFlux端点、优化JPA查询、配置Spring Security、解决云原生应用里的认证问题等等。
元数据里写明了版本是1.0.0,领域是语言,触发器包括Spring Boot、Java、微服务、Spring Cloud、JPA、Hibernate、WebFlux等等。这些触发器就像是关键词,当用户提到这些词的时候,Claude就会考虑调用这个技能。
这个技能的核心工作流程分为六个步骤:架构分析、领域设计、实现、数据层、安全和配置、质量保证。每一步都有具体的操作指南,就像是给你一个说明书,告诉你应该怎么一步步做。
比如说,在数据层这一步,它会运行mvn verify -pl 来确认查询的正确性。如果集成测试失败了,它会查看Hibernate SQL日志,修复查询或者映射,然后重新运行,直到成功为止。
在质量保证这一步,它会运行mvn verify来确认所有测试都通过,而且覆盖率要达到85%以上。如果覆盖率低于阈值,它会通过JaCoCo报告识别未经测试的分支,添加缺失的测试用例,然后重新运行。
用Claude Code写Spring Boot:输入提示
现在是时候来测试我们的模板了。克隆仓库之后,导航到它的根目录,然后运行Claude Code。这是我用来生成示例应用的提示:
创建公开REST API并连接到当前目录中的PostgreSQL数据库的应用程序。
应用程序应该有一个Person实体,其中包含每个人的id和典型字段。
所有REST端点都应使用JWT和OAuth2进行保护。
代码库应使用Skaffold部署在Kubernetes上。
这个提示很简单,就是描述了一个典型的Spring Boot应用需要做的事情:提供一个REST API,连接PostgreSQL数据库,用JWT和OAuth2保护端点,然后用Skaffold部署到Kubernetes。
当然,这个提示应该被视为更广泛的整体的一部分,也就是我们之前介绍的所有组件一起配合起来,才能发挥出最大的威力。
启动Claude Code,见证奇迹的时刻
启动Claude Code之后,我输入了上面的提示。Claude Code立刻就开始工作了,它首先创建了计划,并制定了实施策略。
这个计划非常详细,它列出了关键技术和架构决策,以及成功的标准。比如说,它会告诉你,它打算用什么版本的Spring Boot,用什么方式处理JWT,用什么工具来部署到Kubernetes。
它还给出了生成我们的应用程序所需要的token数量的估计。这就像是,你去超市买东西,提前看看购物车里总共要花多少钱,心里有个数。
计划细节:每一步都清晰可见
计划里详细说明了整个实施方案。它会告诉你,它会先创建项目结构,然后添加依赖,接着编写实体类、Repository、Service、Controller,再然后是配置安全认证,最后是生成Dockerfile和Kubernetes部署文件。
每一步都有具体的行动指南,就像是给你一个清单,你只需要照着清单打勾就行了。这让我觉得特别放心,因为我知道Claude不是在那里瞎编乱造,而是有一个清晰的思路。
剩下的就是批准这个计划,然后等着Claude继续生成代码。这种感觉就像是,你点了外卖,然后看着骑手一步步接近你的位置,心里充满了期待。
代码生成:十步成诗,步步为营
Claude Code将整个项目分成了十个阶段。你可以查看当前阶段,看看它正在做什么,以及生成的输出是什么。
除了Spring Boot应用的标准组件,比如Controller、Service、Repository,它还会生成CircleCI管道、使用Testcontainers进行测试、Dockerfile和Kubernetes部署清单。这些东西都是我们之前提到的,它都一一实现了。
过了一会儿,应用就生成了。对我来说,重要的是它详细描述了做了什么以及如何做的。无论是在最后还是在计划过程中,它都会记录下每一步的操作。这就像是,你请了一个装修队,他们不仅把房子装好了,还给你留了一份详细的施工日志,告诉你每一步是怎么做的。
Claude还创建并运行了所有JUnit测试。这就像是,它写完代码之后,还自己测试了一遍,确保代码能正常运行。
最终结果:3700行代码的诞生
这是最终的项目结构和后续步骤的简要说明。你可以看到,整个项目结构清晰,代码整洁,注释详细。
你也可以通过运行/cost命令来验证总成本。你猜猜这次生成花了多少钱?它生成了大约3700行代码,总共花了不到两美元。两美元是什么概念?那就是一瓶可乐的钱,你就能得到一个完整的Spring Boot应用,带JWT认证、PostgreSQL数据库、Kubernetes部署,还有完整的测试。
你也可以验证与sonnet分支相关的拉取请求中生成的代码。同样的提示,使用主要的内置代理而不是spring-boot-engineer代理,成本要高得多,而且代码质量也差一些。这就说明,我们这套模板确实能帮你省token,还能生成更好的代码。
结论:这不是终点,而是起点
这个Spring Boot的Claude代码模板,主要目的是生成满足你期望的高质量代码。在这套体系里,token消耗是次要的,代码质量才是最重要的。
我还在不断比较不同的设置,努力优化这个模板,让它能更好地生成应用。一般来说,Claude文档提供了很多关于如何构建模板的建议,但很难一下子就知道某个改动对生成时间、token使用量和代码质量的影响。
所以,你可以用这个模板作为实验的起点,自己去尝试,自己去探索。也许你会找到更好的方法,也许你会发现新的技巧。无论如何,这个过程都会让你对AI辅助编程有更深的理解。
最后,我想说,这套模板就像是给Claude穿上了定制的西装,让它从一个实习生变成了一个专业的Spring Boot开发工程师。虽然它还在不断成长,但我相信,有大家的帮助,它一定会变得越来越好。
作者简介:Piotr Minkowski是一位在Java和Spring Boot领域深耕多年的资深开发者和技术博主。他不仅精通技术,还善于用幽默的方式分享知识,让枯燥的技术变得有趣。他对AI辅助编程有着深刻的理解,这篇文章就是他这种能力的完美体现。