openidea
解决方案:为项目固定使用支持 Java 21 预览语法的 jdtls 1.32.0,并让它运行在 JDK 21 上。
具体:
- 保留项目配置:项目 JDK、语言级别继续为 21,POM 中原有的
--enable-preview保留,_ -> ...等预览语法没有改写。 - 切换语言服务器版本:单独安装 Eclipse 官方 jdtls 1.32.0,在当前项目设置中指定它的路径。原来的 1.63.0 会拒绝 Java 21 的预览模式。
- 设置语言服务器 JDK 为 21:1.32.0 可以使用 JDK 21 启动。
- 使用独立索引目录:避免复用新版 jdtls 的缓存,重新导入项目。
对应配置在 .openidea/settings.toml:
[languages.java]
jdk = "/Users/wxl/.sdkman/candidates/java/21.0.10-zulu/zulu-21.jdk/Contents/Home"
jdtlsJdk = "/Users/wxl/.sdkman/candidates/java/21.0.10-zulu/zulu-21.jdk/Contents/Home"
languageLevel = "21"
[tools.jdtls]
path = "/Users/wxl/Library/Application Support/ai.l0ng.openidea/tools/jdtls-java21-preview-1.32.0/bin/jdtls"
[languageServers.jdtls]
args = ["-data", "/Users/wxl/Library/Caches/ai.l0ng.openidea/jdtls-java21-preview-cloud-platform"]
目前的限制是:OpenIDEA 的部分引用增强功能依赖新版 jdtls API,失败时会回退到标准引用查找,不影响应用启动。
vscode
具体是把 “点击 Run/Debug 时如何编译、用哪个 Java 启动” 配置明确了。
-
切换并固定扩展版本
我通过 VS Code 命令行安装了 Java 扩展 1.28.1、Test Runner 0.40.1,并固定版本,避免自动更新。相当于在扩展页面选择“安装其他版本”,再关闭该扩展的自动更新。
-
在 settings.json 新增两项
"java.debug.settings.forceBuildBeforeLaunch": false, "java.autobuild.enabled": false含义分别是:
- 不再由 Java 调试扩展在启动前触发 Eclipse 编译。
- 不再由 jdtls 自动更新
.class文件。
代码补全、跳转、编辑器分析仍由 jdtls 提供。你原有的 JDK 21、预览参数和 4 GB 语言服务器内存配置保留。
-
在 launch.json 给启动配置补充三个字段
以 IoT 为例:
"javaExec": "/Users/wxl/.sdkman/candidates/java/21.0.10-zulu/zulu-21.jdk/Contents/Home/bin/java", "vmArgs": "--enable-preview", "preLaunchTask": "Maven: compile IoTStandaloneApp"分别指定:应用使用 JDK 21、运行时启用预览特性、启动前先执行指定任务。AgentHub 也做了同样配置,对应自己的编译任务。
-
新增 tasks.json
IoT 的任务实际执行:
./mvnw -pl mhauto-iot-platform/mhauto-iot-standalone -am -DskipTests compile任务通过环境变量
JAVA_HOME指定 JDK 21。其中-pl选择目标模块,-am连同它依赖的本仓库模块一起编译。AgentHub 对应执行:
./mvnw -pl mhauto-agenthub -am -DskipTests compile
所以现在点击 Run/Debug 后,流程是:
先用 JDK 21 执行 Maven 编译 → 编译成功后,由 VS Code 用 JDK 21 加 --enable-preview 启动或调试。
清理语言服务器缓存,并执行过一次全仓库 clean compile,用于恢复完整的构建产物;这不是每次启动都会执行的操作。
转载自 CSDN-专业IT技术社区
原文链接:https://blog.csdn.net/u014087707/article/details/170544177



