让 Spring Boot 应用跑在桌面上
演示如何将 Spring Boot 后端与 Tauri 桌面框架集成,将 Java 应用打包成真正的原生桌面应用。
许多团队已有成熟的 Spring Boot 应用,但想要提供桌面应用体验时面临选择:
| 方案 | 优点 | 缺点 |
|---|---|---|
| Electron + 后端服务 | 技术成熟 | 需要独立部署后端,体积大 (100MB+) |
| 纯前端桌面应用 | 部署简单 | 无法复用现有 Spring Boot 逻辑 |
| 传统 Java Swing/JavaFX | Java 技术栈 | UI 开发落后,需重写界面 |
| Tauri + Spring Boot | 复用代码,原生体验,小体积 | 需要 Rust 构建环境 |
- 零代码迁移 - Spring Boot 应用无需修改
- 自动进程管理 - Tauri 自动启动/停止后端
- 原生体验 - 系统 Tray、文件对话框、通知等
- 小体积 - 相比 Electron 节省约 90% 体积
- 企业内部工具桌面化
- 已有 Spring Boot 应用,需要离线桌面版
- 需要访问本地文件系统或硬件
- 对应用体积敏感的场景
- ✅ Tauri 自动启动和管理 Spring Boot 进程
- ✅ 前端通过 HTTP 与 Spring Boot 通信
- ✅ 应用关闭时自动停止后端进程
- ✅ 打包成独立桌面应用(.app/.dmg)
poc-tauri-spring/
├── backend/ # Spring Boot 后端
│ ├── src/main/java/.../
│ │ ├── Application.java
│ │ └── controller/ApiController.java
│ ├── src/main/resources/
│ │ └── application.yml
│ └── pom.xml
├── src/ # 前端静态文件
│ ├── index.html
│ └── app.js
├── src-tauri/ # Tauri 配置
│ ├── src/
│ │ └── main.rs
│ ├── Cargo.toml
│ ├── tauri.conf.json
│ └── icons/icon.png
├── build.sh # 构建脚本
├── dev.sh # 开发运行脚本
└── README.md
| 组件 | 技术 |
|---|---|
| 后端 | Spring Boot 3.3.3 + Java 21 |
| 前端 | 纯 HTML/CSS/JavaScript |
| 桌面 | Tauri 2.x + Rust |
java -version # Java 21+
mvn -version # Maven 3.6+
rustc --version # Rust 1.70+
cargo install tauri-cli # Tauri CLI./dev.sh- Spring Boot 后端自动启动在
http://localhost:8080 - Tauri 窗口打开,显示前端界面
- 前端自动检测后端就绪状态
./build.sh输出:
- macOS DMG:
src-tauri/target/release/bundle/dmg/ - macOS APP:
src-tauri/target/release/bundle/macos/
应用启动后:
- 后端健康检查 - 自动检测,显示"运行中 ✓"
- API 测试
GET /api/hello- 欢迎消息GET /api/info- 系统信息POST /api/echo- 回显测试
- 进程管理 - 关闭窗口,后端自动停止
// src-tauri/src/main.rs
let child = if native_binary.exists() {
Command::new(&native_binary).spawn()
} else if jar_file.exists() {
Command::new("java").arg("-jar").arg(&jar_file).spawn()
};
*state.backend_process.lock().unwrap() = Some(child);// src/app.js
async function checkBackendStatus() {
const maxRetries = 30;
for (let i = 0; i < maxRetries; i++) {
try {
const response = await fetch(`${API_BASE}/actuator/health`);
if (response.ok) return true;
} catch { await sleep(1000); }
}
}┌─────────────────────────────────┐
│ Tauri 桌面应用 │
│ ┌─────────────────────────┐ │
│ │ WebView (前端 UI) │ │
│ │ HTML + CSS + JS │ │
│ └───────────┬─────────────┘ │
│ │ HTTP │
│ ┌───────────▼─────────────┐ │
│ │ Tauri Core (Rust) │ │
│ │ - 进程管理 │ │
│ └───────────┬─────────────┘ │
│ │ │
│ ┌───────────▼─────────────┐ │
│ │ Spring Boot 进程 │ │
│ │ - REST API │ │
│ └─────────────────────────┘ │
└─────────────────────────────────┘
- ✅ 零后端改动
- ✅ 自动进程管理
- ✅ 独立打包
- ✅ 用户体验良好
启动后显示"后端启动超时"
- 检查 Java 21 是否安装
- 查看控制台日志
打包后无法运行
- 确保
backend/target/src-spring.jar存在
macOS 提示"无法打开应用"
xattr -cr /path/to/appMIT License