在Spring AI项目中移除未使用的Gemini和Vertex AI组件
问题引入:为什么需要清理未使用的AI组件?
当你的Spring AI应用部署到生产环境时,是否遇到过这些问题:启动时间过长、内存占用过高、构建包体积过大?这些问题很可能源于项目中包含了未使用的AI组件,尤其是Gemini和Vertex AI这类大型依赖。
在一个典型的Spring AI项目中,未使用的Google AI组件可能会增加20-30%的构建大小,延长15%以上的启动时间,同时带来不必要的安全依赖风险。
本文将通过一套系统化的方法,帮助你安全、高效地移除这些未使用组件,优化项目性能。
环境检测:定位项目中的Gemini和Vertex AI组件
依赖树可视化分析
在开始清理前,我们首先需要确认项目中是否存在Gemini和Vertex AI相关组件。最直接的方法是分析项目依赖树:
Maven项目
mvn dependency:tree | grep -E 'vertex-ai|google-genai'
Gradle项目
./gradlew dependencies | grep -E 'vertex-ai|google-genai'
⚠️ 如果命令执行失败,可能需要检查构建工具配置或环境变量设置,如确保JAVA_HOME正确配置。
组件识别清单
根据Spring AI项目结构,Gemini和Vertex AI相关组件通常包括:
| 组件类型 | Maven坐标 | 说明 |
|---|---|---|
| 启动器 | spring-ai-starter-model-vertex-ai-gemini | Gemini聊天模型启动器 |
| 启动器 | spring-ai-starter-model-google-genai | Google GenAI通用接口 |
| 启动器 | spring-ai-starter-model-vertex-ai-embedding | Vertex AI嵌入模型 |
| 自动配置 | spring-ai-autoconfigure-model-vertex-ai | Vertex AI自动配置类 |
源码级依赖检查
除了构建依赖外,还需要检查代码中是否存在直接引用:
grep -rni 'com.google.cloud.aiplatform' src/
grep -rni 'VertexAi' src/
grep -rni 'Gemini' src/
分级移除方案:从简单到复杂的移除策略
基础级:依赖排除法(推荐用于单模块项目)
最直接有效的方法是在构建文件中显式排除不需要的依赖。
Maven项目(pom.xml)
<dependency>
<groupId>org.springframework.ai</groupId>
<artifactId>spring-ai-starter</artifactId>
<exclusions>
<!-- 排除Gemini相关依赖 -->
<exclusion>
<groupId>org.springframework.ai</groupId>
<artifactId>spring-ai-starter-model-vertex-ai-gemini</artifactId>
</exclusion>
<!-- 排除Vertex AI嵌入模型 -->
<exclusion>
<groupId>org.springframework.ai</groupId>
<artifactId>spring-ai-starter-model-vertex-ai-embedding</artifactId>
</exclusion>
<!-- 排除Google GenAI -->
<exclusion>
<groupId>org.springframework.ai</groupId>
<artifactId>spring-ai-starter-model-google-genai</artifactId>
</exclusion>
</exclusions>
</dependency>
Gradle项目(build.gradle)
implementation('org.springframework.ai:spring-ai-starter') {
exclude group: 'org.springframework.ai', module: 'spring-ai-starter-model-vertex-ai-gemini'
exclude group: 'org.springframework.ai', module: 'spring-ai-starter-model-vertex-ai-embedding'
exclude group: 'org.springframework.ai', module: 'spring-ai-starter-model-google-genai'
}
✅ 推荐:此方法最彻底,直接从依赖树中移除组件,适合生产环境使用。
进阶级:配置文件禁用(适合开发环境快速切换)
如果需要保留依赖但临时禁用组件,可以通过配置文件实现:
application.properties
# 禁用Gemini聊天模型
spring.ai.vertex.ai.gemini.enabled=false
# 禁用Vertex AI嵌入模型
spring.ai.vertex.ai.embedding.enabled=false
# 禁用Google GenAI
spring.ai.google.genai.enabled=false
# 可选:设置默认模型为none
spring.ai.model.chat=none
spring.ai.model.embedding=none
application.yml
spring:
ai:
vertex:
ai:
gemini:
enabled: false
embedding:
enabled: false
google:
genai:
enabled: false
model:
chat: none
embedding: none
⚠️ 注意:配置文件禁用只是阻止自动配置,但相关依赖仍然会打包到应用中,不会减小构建体积。
专家级:条件注解控制(适合多环境定制)
对于复杂项目,可以使用Spring的条件注解精确控制组件加载:
@Configuration
public class AiModelConfiguration {
@Bean
@ConditionalOnProperty(
name = "spring.ai.vertex.ai.gemini.enabled",
havingValue = "true",
matchIfMissing = false
)
public VertexAiGeminiChatModel vertexAiGeminiChatModel() {
// 仅当显式启用时才创建Bean
return new VertexAiGeminiChatModel();
}
}
或者创建专用的禁用配置类:
@Configuration
@ConditionalOnProperty(
name = "spring.ai.vertex.ai.enabled",
havingValue = "false",
matchIfMissing = true
)
public class VertexAiDisabledConfiguration {
// 可以在这里提供替代实现或空Bean
}
多模块项目特殊处理
在多模块项目中,需要特别注意父模块和子模块的依赖传递:
- 检查父POM:确保父模块中没有全局引入相关依赖
- 子模块排除:在每个子模块中单独排除不需要的依赖
- 共享配置:使用
dependencyManagement统一控制版本和排除规则
<!-- 在父POM中 -->
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.ai</groupId>
<artifactId>spring-ai-starter-model-vertex-ai-gemini</artifactId>
<version>${spring-ai.version}</version>
<exclusions>
<!-- 全局排除规则 -->
</exclusions>
</dependency>
</dependencies>
</dependencyManagement>
验证流程:确保组件已完全移除
构建验证
完成移除后,首先验证构建产物:
-
检查依赖树:重新生成依赖树确认组件已移除
mvn dependency:tree | grep -E 'vertex-ai|google-genai' -
分析构建大小:对比移除前后的JAR/WAR包大小
# 构建后检查大小 du -sh target/*.jar
启动验证
启动应用并验证:
-
检查自动配置报告:
java -jar target/*.jar --debug搜索日志中的"AutoConfigurationReport",确认相关自动配置类未被加载
-
检查启动时间:使用以下命令记录启动时间
time java -jar target/*.jar
功能验证
编写简单的测试用例验证核心功能不受影响:
@SpringBootTest
public class AiComponentsTest {
@Autowired(required = false)
private VertexAiGeminiChatModel geminiChatModel;
@Autowired(required = false)
private VertexAiEmbeddingModel vertexAiEmbeddingModel;
@Test
void testGeminiComponentsNotLoaded() {
assertNull(geminiChatModel, "Gemini模型不应被加载");
assertNull(vertexAiEmbeddingModel, "Vertex AI嵌入模型不应被加载");
}
// 测试其他AI功能仍然正常工作
@Test
void testRemainingAiFunctionality() {
// 验证其他AI模型可以正常工作
}
}
组件移除效果量化指标
记录并对比以下指标评估移除效果:
| 指标 | 移除前 | 移除后 | 改进幅度 |
|---|---|---|---|
| 构建包大小 | 50MB | 35MB | -30% |
| 启动时间 | 8.5秒 | 6.2秒 | -27% |
| 内存占用 | 450MB | 320MB | -29% |
| 依赖数量 | 87 | 63 | -28% |
风险规避:避免常见移除错误
依赖传递陷阱
⚠️ 常见问题:直接排除了主要starter,但其他依赖间接引入了相同组件。
解决方案:使用mvn dependency:tree或gradlew dependencies命令找到依赖传递路径:
# Maven
mvn dependency:tree -Dincludes=org.springframework.ai:*vertex-ai*
# Gradle
./gradlew dependencies | grep -A 10 'vertex-ai'
配置冲突处理
当同时使用多种禁用方式时,注意Spring Boot的配置优先级:
- 显式排除依赖(最高优先级)
- 条件注解控制
- 配置文件设置(最低优先级)
🔍 检查:确保没有在不同配置文件中设置矛盾的属性值
常见问题诊断流程
当移除组件后出现问题,可按以下流程诊断:
- 检查编译错误:确认是否有代码直接引用了已移除的类
- 分析启动日志:查找与Gemini/Vertex AI相关的错误或警告
- 验证自动配置:检查
/actuator/autoconfig端点(如果启用) - 回滚测试:临时恢复依赖,确认问题是否消失
- 检查替代方案:确认是否有其他组件可以提供相同功能
组件替代方案推荐
移除Google AI组件后,可以考虑这些替代方案:
| 功能 | 移除的组件 | 推荐替代 | 优势 |
|---|---|---|---|
| 聊天模型 | Gemini | OpenAI, Mistral AI | 更广泛的社区支持 |
| 嵌入模型 | Vertex AI Embedding | OpenAI Embeddings, Ollama | 本地部署选项 |
| 多模态处理 | Google GenAI | Stability AI, DALL-E | 更专注于图像生成 |
总结
通过本文介绍的环境检测、分级移除、验证流程和风险规避方法,你可以安全高效地从Spring AI项目中移除未使用的Gemini和Vertex AI组件。这不仅能减小应用体积、提高启动速度,还能降低安全风险和维护成本。
记住,组件移除是一个持续优化的过程,建议定期审查项目依赖,保持依赖树的精简和健康。
atomcodeClaude Code 的开源替代方案。连接任意大模型,编辑代码,运行命令,自动验证 — 全自动执行。用 Rust 构建,极致性能。 | An open-source alternative to Claude Code. Connect any LLM, edit code, run commands, and verify changes — autonomously. Built in Rust for speed. Get StartedRust098- DDeepSeek-V4-ProDeepSeek-V4-Pro(总参数 1.6 万亿,激活 49B)面向复杂推理和高级编程任务,在代码竞赛、数学推理、Agent 工作流等场景表现优异,性能接近国际前沿闭源模型。Python00
MiMo-V2.5-ProMiMo-V2.5-Pro作为旗舰模型,擅⻓处理复杂Agent任务,单次任务可完成近千次⼯具调⽤与⼗余轮上 下⽂压缩。Python00
GLM-5.1GLM-5.1是智谱迄今最智能的旗舰模型,也是目前全球最强的开源模型。GLM-5.1大大提高了代码能力,在完成长程任务方面提升尤为显著。和此前分钟级交互的模型不同,它能够在一次任务中独立、持续工作超过8小时,期间自主规划、执行、自我进化,最终交付完整的工程级成果。Jinja00
Kimi-K2.6Kimi K2.6 是一款开源的原生多模态智能体模型,在长程编码、编码驱动设计、主动自主执行以及群体任务编排等实用能力方面实现了显著提升。Python00
MiniMax-M2.7MiniMax-M2.7 是我们首个深度参与自身进化过程的模型。M2.7 具备构建复杂智能体应用框架的能力,能够借助智能体团队、复杂技能以及动态工具搜索,完成高度精细的生产力任务。Python00

