“Spring AI Alibaba停更了”——这个消息在几个Java技术交流群里传开的时候,我看到最多的评论是:“Java彻底完了?”、“AI的机会全归Python了?”、“我是不是该转Golang了?”作为一个从SSH时代一路写Java写到现在的人,我想先说一句:天没塌,而且可能压根就没塌过。Spring AI Alibaba是阿里云推出的一个基于Spring AI的适配组件,核心作用是把通义千问等模型快速集成到Spring Boot应用里。它停更,说明这个特定项目的发展节奏变了,但Java生态里的AI能力并没有因此消失:Spring AI主线还在正常迭代,LangChain4j越来越成熟,Ollama本地模型让Java调用大模型变得极其简单。这篇博文,我想把这件事的来龙去脉、真实影响和Java开发者的实际出路讲透,同时给出几条可以直接落地的技术路线和避坑经验。
1. 先说结论:某适配组件停更,不等于Java生态扛不住
1.1 停更的到底是什么东西
很多人在群里转发消息时,已经把这个项目描述成“Java的AI根基倒了”,这个理解偏差有点大。Spring AI Alibaba是一个桥接项目,它做的事情是:让Spring AI的官方编程模型能够对接阿里云的通义千问系列模型。也就是说,它的上面是Spring AI通用接口,它的下面是通义千问的API,它本身只是一个翻译层、适配层。
打个比方,这就像你买了一台支持国标插座的家电,然后配了一个转接头插到欧标插座上。现在转接头不生产了,你慌什么?家电没坏,插座没坏,你只需要换一个转接头,或者干脆把家电的插头直接做成支持欧标的就行。Spring AI Alibaba停更,最多就是Spring AI和通义千问之间的这条路需要换一种走法,绝不是什么根基问题。
那为什么大家这么慌?说白了,是“Spring AI Alibaba”这个名字里带着Spring和AI两个热门标签,停更的消息一出来,很多没细看的人以为Spring AI整个项目都停了,以为Java官方框架放弃了AI。这个信息在传播过程中被不断放大,最后变成了“Java完了”的论调。
1.2 开源项目停更背后的几个常见原因
我在国内几个开源社区混了这么多年,见过了太多项目从活跃到沉默的周期。一个开源适配组件停更,原因往往比外部想象的简单:
- 维护成本与收益不成比例:桥接类项目永远要被上游拖着走。Spring AI每更新一版接口,适配层就要跟着改,改一次就是一批issue和PR。如果背后没有全职团队持续投入,个人维护者很容易被拖垮。
- 商业重心转移:云厂商对开源项目的投入,通常会根据其云产品的战略地位动态调整。如果某个模型已经在自家云上有了更原生的Java SDK,那再去维护一个Spring AI适配器,就成了重复劳动,停更是理性的成本选择。
- 项目被更新方案替代:有时候不是社区不做了,而是有了更好的替代方案,比如直接使用Spring AI官方提供的Model API扩展机制,或者直接调用更底层的HTTP接口。
这些原因里,没有一条是因为“Java不行了”。恰恰相反,正是因为Java在工程化领域太成熟,就连AI模型的接入都已经被抽象成了“写个配置、调个接口”这种层次,单一适配组件的停更才不会伤筋动骨。
1.3 恐慌的本质:AI时代Java被边缘化的焦虑
继续往深挖,消息能引发这么大的情绪,根源是Java社区这些年的集体焦虑。AI领域的话语权被Python牢牢占据:训练模型用Python,发论文用Python,开源算法库用Python。年轻人学AI第一句话就是“先装Python环境”,这导致Java开发者总觉得自己站在AI列车的月台上,车已经开了。
但这里有一个关键误区:AI的完整链路从来不只是“训练模型”。模型训练是AI的最上游,是科研和算法工程师的战场;而大部分企业用AI的方式,是把已经训练好的模型集成到自己的业务系统里,做客服问答、内容审核、推荐排序、风险控制。这些系统要处理高并发、要保证事务一致性、要跟ERP和CRM对接、要能在凌晨三点出问题时有完整监控链路——这一整块,恰恰是Java统治了二十多年的地盘。
我发现很多Java开发者不是没机会,而是被“别人家的算法”吓住了,连自己家门口的机会都没看清楚。
2. 重新认识Java在AI时代的真实身位
2.1 模型训练和AI应用落地是两回事
先建立两个清晰的分类。第一类叫“模型工程”,核心是数据清洗、特征工程、模型训练、调参、评估,这个领域的绝对主力是Python,因为PyTorch、TensorFlow、HuggingFace的生态都在这边,你非要用Java去训大模型,那是自讨苦吃。
第二类叫“应用工程”,核心是模型怎么接到业务场景里,怎么做RAG知识库、怎么管理对话会话、怎么把模型的输出转换成业务数据结构、怎么在流量高峰时保证响应时间。这一类工作里,Java那些所谓的老本事全部派得上用场:Spring Boot的依赖注入帮你管理AI客户端生命周期,微服务体系帮你做模型服务的水平扩展,Sentinel这类组件帮你保护模型调用的限流降级,Prometheus加Grafana帮你盯住模型延迟。
可以看看市面上成功的AI应用,比如智能客服、企业知识库问答、AI辅助编程插件,它们的前端和业务后端大部分是Java或Golang写的,底层模型调用的部分只是整个系统里一个组件。这就好比盖楼,Python是水泥厂,生产钢筋水泥;Java是施工队,负责把楼盖起来。水泥厂停产一天工地会停工,但施工队不会消失。
2.2 Spring生态没有停,而是在All in AI
再具体看Spring的动向。Spring AI这个主线项目,是目前Spring生态里更新最频繁的子项目之一,几乎每月都有新版本,官方团队一直在加功能:结构化输出、函数调用、聊天记忆、RAG组件、多模态支持,以及对各种模型提供方的统一接入。
Spring Boot 4也已经进入实质性开发阶段,配合GraalVM原生镜像,Java应用能做到启动时间几百毫秒、内存占用大幅降低。这些东西原本是为了云原生场景准备的,放到AI时代同样非常关键——大模型应用往往要处理长连接、流式输出,一上来就是几十个并发任务,资源利用率直接决定成本,原生镜像带来的内存节省在这里是真金白银。
所以Spring生态非但没有退出AI,反而在AI基础工程上加快了脚步。Spring AI Alibaba停更,最多就是Spring生态在阿里云这一朵云上的适配少了一个官方入口,并不改变Spring在AI应用层的总体布局。
2.3 Java开发者真正该盯的四个AI方向
基于上面的分析,我给身边问“Java还能做AI吗”的朋友列过一张方向清单,这里分享给你:
- AI应用集成:把大模型API封装成公司内部的统一调用服务,做鉴权、限流、熔断、日志审计。这是当前需求最大的方向,每一个想用AI的传统企业都需要。
- RAG知识库落地:帮助企业内部的知识文档变成可问答的智能库,核心工作是文本处理、向量化、检索优化、Prompt拼接,工程复杂度高,Java后端经验完全对口。
- 智能体编排:把大模型的单次调用编排成多步骤的工作流,比如“查库存->生成采购建议->发送审批”,这种流程编排能力,Java的工作流引擎和状态机经验可以无缝迁移。
- 模型服务化与网关:在模型API和业务之间放一层网关,负责模型路由、缓存、重试、SSE协议转换,这是典型的中间件开发工作,也是Java的祖传手艺。
这四个方向有个共同点:它们都不是“研究怎么训模型”,而是“怎么让模型老老实实地在自己的业务里干活”。我接触过的很多AI落地项目,最终卡住的都不是模型效果,而是工程接入、稳定性、数据安全这些Java老本行的问题。
3. Java接入大模型,四条可以马上上手的路线
3.1 路线一:继续用Spring AI,最平滑的过渡
Spring AI Alibaba停更不假,但Spring AI官方并没有停,而且它对模型提供方的支持方式是通用的。Spring AI定义了一套标准的接口,你通过配置替换不同的ModelClient实现来切换模型供应商。
如果你之前用的就是Spring AI Alibaba,过渡方案很简单:直接去掉Alibaba的依赖,改用Spring AI自带的OpenAI兼容客户端或HttpClient客户端。大多数国产模型的API都兼容OpenAI协议,这意味着只需要改配置项里model和base-url,代码基本不用动。
一个典型的Spring AI配置大概是这样的:
spring: ai: openai: base-url: http://your-model-endpoint api-key: ${AI_API_KEY} chat: options: model: qwen-plus temperature: 0.7然后在Service里注入ChatClient:
@Service public class AIService { private final ChatClient chatClient; public AIService(ChatClient.Builder builder) { this.chatClient = builder.build(); } public String ask(String question) { return chatClient.prompt() .user(question) .call() .content(); } }这套写法的核心思想是:你面向Spring AI的抽象编程,具体底层是哪个模型、哪个云厂商,全靠配置驱动。这样一来,某个适配组件停更就完全不影响你的业务代码。
3.2 路线二:Ollama本地模型,零成本练手
有些朋友说,我不想注册云服务商的API,也不想考虑联网问题,我就想本地拿个模型练练手。Ollama就是最合适的工具。它的本质是一个本地大模型运行工具,支持把Qwen、Llama、DeepSeek等模型跑在自己电脑上,并且默认暴露一个HTTP API。
Ollama不需要Java任何特殊集成,因为它的接口就是普通的HTTP返回JSON流。Java端可以使用任何HTTP客户端,比如WebClient或者最普通的RestTemplate。我用Java 21的HttpClient写过最简单的调用:
public String chatWithOllama(String prompt) throws Exception { String url = "http://localhost:11434/api/chat"; String json = """ {"model": "qwen2.5:7b", "messages": [{"role": "user", "content": "%s"}], "stream": false} """.formatted(prompt); HttpClient client = HttpClient.newHttpClient(); HttpRequest request = HttpRequest.newBuilder() .uri(java.net.URI.create(url)) .header("Content-Type", "application/json") .POST(HttpRequest.BodyPublishers.ofString(json)) .build(); HttpResponse<String> response = client.send(request, HttpResponse.BodyHandlers.ofString()); return response.body(); }本地跑模型的好处是:数据不出内网,适合处理敏感的业务数据;没有调用次数限制,调试Prompt可以随便试;不花钱,开发环境压力很小。缺点是需要一块过得去的显卡,纯CPU也能跑7B级别的量化模型,就是速度慢一些,日常验证功能完全够用。如果你手头没有云服务商的额度,我建议直接从Ollama开始。
3.3 路线三:LangChain4j,另一个值得认真考虑的框架
LangChain4j可以理解成Java版的LangChain,它没有Spring强绑定,可以跟Spring Boot、Quarkus、Micronaut等框架自由配合。它最吸引我的几个特性,一个是AI Service注解,可以用接口定义AI行为;一个是内置的工具调用支持;还有一个是完整的RAG组件,从文档切块到向量检索都给你搭好了架子。
举个例子,LangChain4j里定义一个AI Service只要用接口加注解:
@AiService public interface CustomerAssistant { @SystemMessage("你是客户服务助理,请用简洁专业的语气回答。") String chat(@UserMessage String question); }然后你在配置类里绑定模型和它对话:
@Bean ChatLanguageModel chatLanguageModel() { return OpenAiChatModel.builder() .baseUrl(System.getenv("MODEL_BASE_URL")) .apiKey(System.getenv("AI_API_KEY")) .build(); }LangChain4j和Spring AI怎么选?以我的经验:如果你的项目已经重度依赖Spring Boot,优先用Spring AI,跟Spring的配置体系和自动装配结合得更自然;如果你希望框架更轻、可定制性更强,或者你有用Quarkus/GraalVM做原生镜像的诉求,LangChain4j会更顺。两个框架的接口风格都成熟,选一个深耕就行,不要两个项目里来回横跳。
3.4 路线四:原生HTTP调用,最普适的后手
讲个扎心的道理:框架可以停更,你的业务代码不能因为框架停更就停摆。所以无论你选了Spring AI还是LangChain4j,我都强烈建议你至少手写一遍原生HTTP调用模型的流程,知道不带任何框架的时候,事情到底是怎么被完成的。
上面Ollama的例子已经展示了核心逻辑,换成任意云服务商的接口也都一样:构造JSON请求体,设置Authorization头,POST出去,把返回的JSON里content字段拿出来。流式输出也无非是把HttpClient的BodyHandlers换成BodyHandlers.ofLines(),逐行解析data字段。
这一层的价值在于:它是所有框架的地基,真正到了排查生产问题、对接一款没有Spring适配器的新模型时,这个兜底能力能救你一命。框架会迭代、会过时,但HTTP调JSON这个模式二十年不大会变。
4. RAG落地实战:Java给企业知识库装个大脑
4.1 RAG为什么是Java开发者的最佳突破口
与其愁眉苦脸地纠结“模型怎么选”,不如把精力放在一个确定性很高的事情上——RAG,也就是检索增强生成。大模型最让人头疼的问题是“一本正经地胡说八道”,尤其是涉及企业内部知识、最新制度、产品参数的时候,你不可能让模型靠训练数据里的旧知识来回答,更不可能让私有数据跑到第三方模型训练集里去。
RAG的思路就一句话:不逼模型背知识,只让模型当个优秀的阅读者。用户提问时,系统先从企业知识库里检索出相关的文档片段,把片段拼进Prompt,让模型基于这些片段来回答。整个链路里,模型的角色被弱化为“阅读理解器”,知识事实的准确性由检索系统保证。
这个架构对Java后端开发者极其友好:文档从哪儿来、怎么存、怎么切块、怎么建立索引,这些全都是传统后端的活儿。其实践中最大的工作量,恰恰不在模型调参,而在工程整合。
4.2 技术选型对比:这里没有银弹
我梳理过一份RAG组件选型表,直接贴给你参考:
| 组件 | 方案 | 适用场景 | 备注 |
|---|---|---|---|
| 向量库 | Qdrant | 中小规模、性能优先 | 有官方Java客户端,部署简单 |
| 向量库 | PostgreSQL + pgvector | 复用现有数据库 | 减少组件数量,数据一致性更好 |
| 向量库 | Elasticsearch | 已有ES集群、要全文检索+向量混合查询 | 重量级,运维成本高 |
| 切块策略 | 固定大小切块 | 快速验证 | 实现简单,语义容易割裂 |
| 切块策略 | 语义切块/父子切块 | 生产级效果 | 复杂一点,但检索质量明显提升 |
| 嵌入模型 | 本地BGE系列 | 数据敏感,需私有化 | 中文效果不错,部署成本低 |
| 嵌入模型 | 云厂商Embedding API | 追求效果、接受API调用 | 注意调用配额和延迟 |
| 生成模型 | Qwen/Llama本地版或云API | 最终回答质量由它决定 | 选个用着顺手的就行 |
在实际项目里,我见过最多的坑是“过度选型”:明明几千条文档、用户量很小,却上了分布式向量数据库集群,最后维护成本比AI应用本身还高。你要记得,RAG第一步是用最少的组件让它跑通,等效果稳定了再考虑性能扩容。
4.3 一个简化版的Java RAG实现思路
如果要从零开始自己搭一个轻量RAG,大致流程是这样的:
- 文档加载:用Tika或者pdfbox解析PDF、Word、扫描件,转成纯文本。
- 文本切块:按固定长度500到800个字符切开,相邻块之间重叠50到100个字符,避免话题被拦腰截断。
- 向量化:调用嵌入模型把每块文本转成向量数组。
- 存储:把向量和原文一起存入向量库,记录文档ID、来源、更新时间。
- 检索:用户提问后先向量化问题,在向量库做相似度检索,取最相关的TopK块。
- 组装:把检索到的内容拼进Prompt模板,注明“请仅基于以下内容回答”。
- 生成:把完整Prompt发给大模型,得到最终答案。
伪代码形式的查询流程大概是这样的:
public String answer(String question) { float[] questionVector = embeddingModel.embed(question); List<DocumentChunk> candidates = vectorStore.search(questionVector, 5); String context = candidates.stream() .map(c -> "【片段】" + c.getText()) .collect(Collectors.joining("\n")); String prompt = """ 你是知识库助手。请仅根据以下上下文回答用户问题,如果上下文没有相关信息,请如实告知。 上下文: %s 问题:%s """.formatted(context, question); return chatModel.chat(prompt); }这套逻辑不依赖具体框架,无论你用的是Spring AI、LangChain4j还是手写HTTP,都可以实现。
4.4 RAG落地的五个实战避坑点
这些是我做RAG项目踩过之后总结出来的,每一个都是真金白银:
- 切块尺寸是玄学也是科学:切太小,语义不完整;切太大,向量检索精度下降。一般建议中文场景先试500到800字,按产品文档的“标题-段落”结构做二次切分,比纯固定长度效果好得多。
- TopK不是越大越好:一开始以为检索越多给模型越多信息,结果把不相关的内容也塞进去了,模型就被带偏了。我的经验是先设5,配合相关性阈值0.4到0.5,宁可少给也要给得准。
- 嵌入模型和生成模型要配套:你拿英文嵌入模型做中文文档,检索质量会离谱。国产模型做中文任务,先用中文友好的嵌入模型,比如BGE系列或者云厂商的中文Embedding服务。
- 千万别忽略召回率评估:RAG上线前做一个最小的测试集:20个问题,每个问题配上正确答案来自哪里,上线后跑一遍,算一下能召回到正确答案的比例。没有这一步,你根本不知道自己的检索系统行不行。
- Prompt里的指令和上下文要分开:指令和检索到的内容如果混在一起,模型容易被不相关内容干扰。清晰的“你是助手+以下是参考上下文+用户问题”三段式结构,实测最稳定。
5. Java AI开发者的工具箱与选型建议
5.1 一份够用就好的技能工具箱
经常有朋友问,我该学什么框架、什么工具,我列了一个“先少后多”的清单,建议按顺序掌握:
| 阶段 | 工具/技能 | 作用 | 掌握程度 |
|---|---|---|---|
| 第一阶段 | 原生HTTP + JSON解析 | 理解模型调用本质 | 必须熟练 |
| 第二阶段 | Spring AI 或 LangChain4j 选其一 | 企业级集成,少写样板代码 | 必须熟练 |
| 第二阶段 | Ollama | 本地调试模型、快速实验 | 推荐 |
| 第三阶段 | pgvector 或 Qdrant | 存向量、做检索 | 推荐 |
| 第三阶段 | Token计算与Prompt调试 | 控制成本、提升质量 | 终身修炼 |
| 第四阶段 | LangFlow / Dify这类低代码编排 | 给业务方做原型验证 | 了解即可 |
| 第四阶段 | 微调工具 | 只在特定的垂直领域才需要 | 按需学习 |
很多人上来就问“要不要学Python”。如果你已经在Java后端做得不错,答案是:可以把Python当辅助工具,但不要因为焦虑去重开一条技术栈。Java后端的工程能力才是你的护城河,AI本身只是一个新组件。
5.2 本地开发和部署的硬件策略
本地开发机跑本地模型,不需要实验室级别的机器。我自己的经验是:16G内存的Mac或Windows笔记本,跑Ollama上的7B量化模型,速度大概每秒生成10到20个token,拿来调试Prompt流程和接口逻辑没问题;32G以上内存可以流畅跑14B模型;再往上比如32B、70B,就别指望单机了,那是显卡集群的事情。
生产环境部署,更常见的是把模型丢到GPU服务器上用vLLM或同类推理服务跑,对外暴露一个OpenAI兼容的HTTP接口。这样Java应用只需要调用这个接口,底层是几张卡、用的什么框架,对Java这一侧透明。这种模式的好处是:模型升级、扩容、切量,都只影响模型服务端,Java应用不用动。
5.3 给不同阶段Java开发者的建议
刚入行的Java开发者,建议先别碰复杂框架,用原生HTTP调用一个云服务商模型,把一个对话功能从请求到回显完整走通。这个过程的收获比看十篇教程都大,你能直观理解模型接口长什么样,HTTP响应结构是什么样。
做后端业务开发的,最重要的事情是把Spring AI或LangChain4j在项目里用起来,哪怕是搭一个内部Demo。重点理解:模型客户端如何配置、如何用Prompt模板复用提示词、如何让模型输出结构化JSON,这样你才能把AI功能嵌进业务系统的具体业务流程。
如果是资深架构师,反而不急着写代码。把RAG架构、模型网关设计、成本控制、数据安全合规想清楚。比如:哪些数据可以走云端API,哪些只能走本地模型;模型调用失败时业务降级策略是什么;多租户场景下模型API Key和上下文怎么隔离。这些架构层面的决策,决定AI应用能走多远。
6. 常见问题与排查心得
6.1 模型调用超时或假死
现象:第一次调用模型能通,但过一会儿再调就卡住不动了,直到超时。
原因:本地Ollama模型需要把模型加载到内存,当你长时间没有请求,它会释放资源,下一次请求就要重新加载模型,这段时间可能长达几十秒;云端API则可能是连接池被占满,或者接口存在并发限制。
排查思路:先看模型服务端日志,确认是不是在加载模型;再看Java端和模型服务之间有没有超时时间配置,把连接超时、读取超时分别设置(连接超时5秒、读取超时60秒以上);最后看是不是连接池配置太小,建议让模型调用的连接池独立建一个,不要和业务数据库共用。
6.2 流式输出的消息怎么变成一堆乱码
现象:调用模型时开启流式输出,中文内容展示成乱码或一段一段的碎块。
原因:一个是字符编码问题,双方约定用UTF-8基本都能解决,重点检查HttpClient或WebClient响应体的字符集声明;另一个是SSE协议解析不对,流式返回的每一行是以“data:”开头,完整消息可能被拆成多个data块,需要按SSE规范逐行解析。
一个很实用的调试方法:先用curl把模型接口的原始响应打出来看一眼,确认响应格式,再用代码解析。如果curl下正常、Java端乱,八成是解析逻辑的问题,别赖模型。
6.3 向量检索的结果不相关
现象:RAG系统上线后,检索到的“相关知识”跟用户的提问毫无关系。
原因:排第一位的通常是嵌入模型选得不好,中英不匹配或者根本没有针对中文优化;第二位是切块太大,整篇文档被塞成一个向量,检索时命中不到目标段落;第三位是TopK太大,把低相关度的块也带上,干扰模型回答。
排查顺序:先换个中文嵌入模型试试,再把切块调小一点,接着把TopK从5降到3,最后给向量检索加一个相似度阈值。这几步做完,80%的“不相关”问题都能解决。
6.4 应用内存暴涨甚至OOM
现象:跑RAG服务的Java进程内存不断上涨,最终OutOfMemory。
原因:RAG的文档加载和向量化环节最容易出问题。一次性把上万份文档塞进内存,或者嵌入模型返回的大数组没有及时释放,内存压力直接拉满。
应对策略:加载文档时用流式处理,一批一批解析;向量批量写入时控制并发数,别一口气开上百个线程。另外如果你用本地嵌入模型,一定要留意它是跑在Java进程外还是进程内,进程内GGML模型库默认吃内存会非常猛,部署时要给JVM留出足够余量,否则模型库和JVM堆互相抢内存,结果就是频繁Full GC。
6.5 接口返回的JSON结构变化导致代码崩了
现象:同一个模型接口,某天突然返回结构变了,字段名不一样了,反序列化直接抛异常。
原因:云厂商的模型接口虽然宣称兼容OpenAI协议,但多模态、工具调用、流式输出等场景下,字段细节经常有差异。尤其是错误返回结构,很多厂商用的不是标准OpenAI错误格式。
这个坑没有一劳永逸的解法,我的经验是:编写防御式解析,用JSON树方式取字段,遇到缺失就返回兜底值;同时给调用层加一层结构转换,不要让模型接口的响应结构直接渗透到业务代码里。即使将来换模型供应商,业务的响应对象也不用改动。顺便说一句,这也是我建议不要过度依赖某个具体的Spring适配器组件的原因——框架帮你省了样板代码,但底层的健壮性还是得靠自己的抽象层来兜底。
7. 最后说点实在的
写到这里,我想分享一段自己的亲身经历。前两年很多团队一窝蜂上AI项目,朋友圈里全是Transformer和Prompt调优的帖子。当时有个老同事私下问我:“我们这些写了十年Java后端的人,是不是很快就会被时代淘汰?”我没有直接回答,而是反问他一个问题:你们公司如果明天要上一套智能客服,后端要不要Java写?会话管理、工单系统、用户画像、权限体系,哪个离得开现有后端?答案不言自明。
Spring AI Alibaba的停更,跟当年很多框架的淘汰其实没有本质区别。技术的世界就是这样,具体项目和组件像潮水一样来了又走,但Java这门语言赖以生存的工程化能力、成熟的中间件生态、深厚的人才储备,这些底层价值并没有改变。AI给Java带来的不是末日,而是一次重新定位的机会:从CRUD开发者,变成AI应用工程师。
所以与其问“Java还有希望吗”,我更愿意把这个问题换成:“我还有没有掌握与AI协同工作的能力?”把Prompt结构、RAG链路、模型调用抽象、流式协议这些基本功练扎实,你的Java技能包会变得比以往任何时候都值钱。最后的最后,给所有看到这里的Java开发者一句话:别慌,模型会换,框架会停,但工程能力不会过时。希望不是等出来的,是手写代码写出来的。