Appearance
版本矩阵:把依赖一次定死
1. 本节产出
拿到一份可直接复制的依赖配置(含 Maven 仓库、BOM、starter 命名规则),并且学会在遇到版本冲突时的三步定位法。之后每一章都不再为环境问题分心。
2. 前置依赖
- 00-02 环境准备:JDK / Maven / Docker 就绪
3. 为什么版本问题在 Spring AI 里格外严重
三个原因叠加:
- 框架年轻,跨版本有破坏性变更。Spring AI 从 1.0 GA 之后,starter 包名、部分 API 都调整过,网上大量教程用的是旧写法。
- 两个坐标要同时对齐:Spring Boot 版本 ↔ Spring AI 版本,其中之一不对就报各种奇怪的
NoSuchMethodError。 - 里程碑版本不在中央仓库。这是新手最常踩的坑:代码完全照抄,就是拉不到包。
典型故障现场:
java.lang.NoSuchMethodError: org.springframework.ai.chat.model.ChatResponse.getResult()看起来是 API 用法错了,实际 99% 是 classpath 里混进了两个不同版本的 spring-ai 模块。
4. 核心原理:三条对齐规则
规则一:大版本绑定
| Spring AI | 要求 Spring Boot | JDK 基线 |
|---|---|---|
| 1.x(如 1.1.x) | 3.x(3.4 / 3.5) | 17+ |
| 2.x(如 2.0.x) | 4.x | 17+,建议 21 |
提示:以官方发布的兼容矩阵为准。判断原则是大版本要匹配——AI 2.x 配 Boot 4.x,AI 1.x 配 Boot 3.x。混搭(AI 2.x + Boot 3.5)是最常见的作死姿势。
本课程的选择:主线演示走 Spring Boot 4.x + Spring AI 2.0.x + JDK 21。涉及 1.x 差异时,在章节内给出对照写法。
规则二:starter 命名
Spring AI 1.0 GA 之后统一了命名,容易和老教程混淆:
| 类型 | 旧命名(早期里程碑) | 现行命名 |
|---|---|---|
| 模型 starter | spring-ai-spring-boot-starter-openai | spring-ai-starter-model-openai |
| 向量库 starter | spring-ai-pgvector-store-spring-boot-starter | spring-ai-starter-vector-store-pgvector |
看到教程里出现 -spring-boot-starter- 这种中间式写法,就知道是老版本内容,直接按上表转换。
规则三:版本走 BOM,不逐个写
所有 Spring AI 依赖都不要写 <version>,交给 BOM:
xml
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.ai</groupId>
<artifactId>spring-ai-bom</artifactId>
<version>${spring-ai.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.ai</groupId>
<artifactId>spring-ai-starter-model-openai</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.ai</groupId>
<artifactId>spring-ai-starter-vector-store-pgvector</artifactId>
</dependency>
</dependencies>好处:模块之间版本天然一致,升级只需改一处。
5. 操作步骤
步骤 1:加里程碑仓库
如果选用的是尚未 GA 的版本(2.0.x 早期、各种 milestone),必须在 pom 里声明快照/里程碑仓库,否则拉不到:
xml
<repositories>
<repository>
<id>spring-milestones</id>
<name>Spring Milestones</name>
<url>https://repo.spring.io/milestone</url>
<snapshots><enabled>false</enabled></snapshots>
</repository>
<repository>
<id>spring-snapshots</id>
<name>Spring Snapshots</name>
<url>https://repo.spring.io/snapshot</url>
<snapshots><enabled>true</enabled></snapshots>
<releases><enabled>false</enabled></releases>
</repository>
</repositories>提示:优先用 GA 版本。只有在确实需要新特性时才碰里程碑,并且要在 README 里记清楚,因为半年后你自己也会忘记配过这个仓库。
步骤 2:确认实际解析的版本
bash
mvn dependency:tree | grep spring-ai期望:所有 spring-ai-* 的版本号完全一致,只出现一个 spring-ai-core。
步骤 3:确认 Model Starter 实际生效
启动应用,观察日志里有没有对应的自动配置类加载。更稳的办法是写个断言测试:
java
@SpringBootTest
class VersionMatrixTest {
@Autowired ChatModel chatModel;
@Test
void shouldHaveChatModelBean() {
assertThat(chatModel).isNotNull();
}
}能过,说明 starter 与自动配置都对上了。
步骤 4:锁定并写进 README
每个 demo 仓库的 README 里必须有一张「最低可运行版本矩阵」表:
| 组件 | 本项目验证版本 | 备注 |
|---|---|---|
| JDK | 21 | 17 可跑,个别语法需调整 |
| Spring Boot | 4.1.x | |
| Spring AI | 2.0.x | 需里程碑仓库 |
| PGVector | pg16 | docker-compose 内提供 |
| Redis | 7.x | docker-compose 内提供 |
6. 验证清单:三步定位法(出问题用这套)
| 步 | 动作 | 命令/方法 |
|---|---|---|
| 1 | 看 classpath 有没有重复版本 | mvn dependency:tree | grep spring-ai |
| 2 | 看谁把旧版本带进来的 | mvn dependency:tree -Dincludes=org.springframework.ai |
| 3 | 排除掉传递依赖 | 在引入方加 <exclusions> |
绝大多数报错不需要改代码,把依赖理干净就好了。
7. 生产避坑
- 不要混用两套版本体系。最典型的是 copy 老教程的 pom,把
spring-boot-starter-parent3.x 和spring-ai-bom2.x 放一起。判断很简单:Boot 3 → AI 1,Boot 4 → AI 2。 - 里程碑版本的 demo 不要交付给学员当作业。它的 API 可能在你录完课两周就变了,会引发大量答疑。给学员的作业仓库一律锁 GA 版本,并在
dependencyManagement里写死。 - 升级后必须跑一遍全量测试再录下一节。Spring AI 的 API 调整有时会只影响某个边缘方法,编译通过但运行报错,等到录屏现场才发现就晚了。
8. 延伸与锚点
- 思考题:你的公司现在用的是 Boot 2.x 还是 3.x?如果是 2.x,需要先评估升级路径——Spring AI 依赖较新的 Spring 框架版本,绕不过去。
- 代码锚点:
ch00-03-version-matrix - 下一章:00-04 成本速算