OpenCode LSP 实战笔记:解决 JDK8 与 Bun 版本兼容性问题

OpenCode LSP 实战笔记:解决 JDK8 与 Bun 版本兼容性问题

OpenCode LSP 实战笔记:解决 JDK8 与 Bun 版本兼容性问题

问题背景:在使用 OpenCode 开发 Java 8 项目时,连续遇到了两个 LSP 兼容性问题。本文记录了完整的排查过程和解决方案,供遇到类似问题的开发者参考。

问题一:jdtls 无法启动 - JDK 版本冲突

1.1 问题现象

在 OpenCode 中打开 Java 8 项目时,LSP 功能完全不可用:

Error: LSP server cannot be started safely.
Context: jdtls (Java Language Server) failed to start.

具体表现

  • ❌ 代码补全不工作
  • ❌ 无法跳转到定义
  • ❌ 没有错误提示
  • ❌ 重构功能不可用

1.2 问题排查

通过查看 OpenCode 日志,发现关键信息:

jdtls requires JDK 21+ to run, but JAVA_HOME points to JDK 8

根本原因分析

  1. jdtls(Eclipse JDT Language Server) 本身需要 JDK 21+ 才能启动
  2. 但项目需要使用 JDK 8 进行编译
  3. 系统环境变量 JAVA_HOME 设置为 JDK 8,导致 jdtls 无法启动

这是一个典型的工具运行环境项目编译环境版本冲突问题。

1.3 解决方案:双 JDK 配置

经过调研,找到了完美的解决方案:双 JDK 并存,各司其职

配置架构

使用场景JDK 版本配置位置
jdtls LSP 服务器运行JDK 21系统环境变量 JAVA_HOME
项目编译JDK 8Maven pom.xml

具体配置步骤

步骤 1:配置系统环境变量

设置 JAVA_HOME 指向 JDK 21:

# Windows 系统环境变量
JAVA_HOME = D:\jdk-21

# 添加到 PATH
PATH = %JAVA_HOME%\bin;...

为什么要这样做?

  • jdtls 启动时读取 JAVA_HOME
  • LSP 服务器需要新版 JDK 的特性
  • 不影响项目的实际编译版本

步骤 2:配置 Maven 项目编译版本

pom.xml 中指定 JDK 8:

<properties>
    <maven.compiler.source>1.8</maven.compiler.source>
    <maven.compiler.target>1.8</maven.compiler.target>
</properties>

Gradle 项目配置

sourceCompatibility = '1.8'
targetCompatibility = '1.8'

步骤 3:验证配置

重启终端后验证:

# 验证系统 Java 版本(应显示 JDK 21)
java -version
# 输出:java version "21.0.1" ...

# 验证 Maven 配置(应显示 Java 1.8)
mvn -version
# 输出:Java version: 1.8.0_xxx

1.4 工作原理

┌─────────────────────────────────────┐
│ OpenCode 检测到 .java 文件           │
│            ↓                        │
│ 读取 JAVA_HOME (JDK 21)             │
│            ↓                        │
│ 启动 jdtls LSP 服务器               │
│            ↓                        │
│ 提供 IDE 功能(补全、跳转等)       │
├─────────────────────────────────────┤
│ 项目编译时                          │
│            ↓                        │
│ Maven 读取 pom.xml                  │
│            ↓                        │
│ 使用 JDK 8 编译                     │
│            ↓                        │
│ 生成 Java 8 兼容的字节码            │
└─────────────────────────────────────┘

核心思想:分离 LSP 服务器运行环境和项目编译环境,两者互不干扰。

1.5 验证成功

配置完成后,OpenCode LSP 功能全部恢复正常:

  • ✅ 智能代码补全
  • ✅ 快速跳转到定义
  • ✅ 实时错误提示
  • ✅ 强大的重构支持
  • ✅ Java 8 项目正常编译

问题二:LSP 段错误崩溃 - Bun 版本 Bug

2.1 问题现象

解决 JDK 问题后,又遇到新的错误:

Error: LSP server cannot be started safely.
Context ⚠️ Windows + Bun v1.3.5 detected: Known segmentation fault bug with LSP.
This causes crashes when using LSP tools (lsp_diagnostics, lsp_goto_definition, etc.).

SOLUTION: Upgrade to Bun v1.3.6 or later:
powershell -c "irm bun.sh/install.ps1|iex"

WORKAROUND: Use WSL instead of native Windows.
See: https://github.com/oven-sh/bun/issues/25798

具体表现

  • LSP 工具使用时随机崩溃
  • lsp_diagnostics 报段错误
  • lsp_goto_definition 导致 OpenCode 卡死
  • 控制台出现 segmentation fault 错误

2.2 问题排查

环境信息

  • 操作系统:Windows 11
  • Bun 版本:v1.3.5
  • OpenCode:最新版

根本原因

根据 OpenCode 官方提示和 Bun GitHub Issue #25798:

Bun v1.3.5 在 Windows 平台存在已知的段错误 bug,影响 LSP 功能的稳定性。

这是一个 Windows + Bun v1.3.5 特定问题,Linux/macOS 不受影响。

2.3 解决方案

方案一:升级 Bun(推荐)

升级命令

# Windows PowerShell
powershell -c "irm bun.sh/install.ps1|iex"

验证版本

bun --version
# 应显示 v1.3.6 或更高版本

升级后,LSP 崩溃问题完全解决。

方案二:使用 WSL(备选)

如果升级后仍有问题,可以在 WSL 环境中运行 OpenCode:

# 安装 WSL(如果尚未安装)
wsl --install

# 在 WSL 中使用 OpenCode
wsl
# WSL 中的 Bun 不存在这个 bug

2.4 问题总结

问题环境条件解决方案
JDK 版本冲突Java 8 项目 + jdtls双 JDK 配置
Bun 段错误Windows + Bun v1.3.5升级到 v1.3.6+

经验教训

  • 🔧 LSP 兼容性问题可能来自多个层面(JDK、运行时、操作系统)
  • 🔧 遇到问题先看官方错误提示,通常有明确的解决方案
  • 🔧 保持工具版本更新可以避免已知 bug

总结与最佳实践

核心原则

  1. 分离关注点

    • LSP 服务器运行环境 ≠ 项目编译环境
    • 它们可以使用不同的版本
  2. 理解工具链

    • jdtls 需要 JDK 21+ 运行
    • 项目编译可以使用 JDK 8
    • Bun 版本影响 OpenCode 稳定性
  3. 保持更新

    • 定期更新工具链到最新稳定版
    • 关注 GitHub Issues 了解已知问题

适用场景

  • ✅ OpenCode + Java 8/11/17 项目
  • ✅ Windows + Bun 环境
  • ✅ 需要完整 LSP 功能的开发场景

相关资源


关键词

OpenCode, LSP, Java 8, JDK 21, jdtls, Bun v1.3.5, segment fault, Windows, WSL, 双JDK配置, 故障排查, 实战笔记, 兼容性问题


💡 记住两个关键点:

  1. 工具的运行环境 ≠ 项目的编译环境 - 合理分离,各司其职
  2. 保持工具版本更新 - 避免已知 bug,提升稳定性

希望这篇笔记对遇到类似问题的开发者有所帮助!