为 OSX 的 VSCode 配置 JDK 17

想升级一下 jdk,结果一下子就陷进去了,记录一下当时是如何解决的

准备

假定我们是使用 brew 安装 jdk17,如果使用 brew info jdk 或是 brew info java, 都会将我们指向到 openjdk: stable 17.0.1。

openjdk 是安装在 /usr/local/opt/openjdk,但是为了能让系统可以正确识别,我们需要 设一个 symbol link,而且这个软连接并不是指向 jdk 的根目录,而是指向 /usr/local/opt/openjdk/libexec/openjdk.jdk, 这个命令非常重要,虽然 brew 有在 Caveats 写明, 即使可能不需要执行,也不要漏看这一条。 为了确保不必要的麻烦,我们还是设一下软连接:

sudo ln -sfn /usr/local/opt/openjdk/libexec/openjdk.jdk /Library/Java/JavaVirtualMachines/openjdk.jdk

配置 VSCode

打开 settings.json,与 jdk 相关的配置如下:

  // sonar lint 需要 java home
  "sonarlint.ls.javaHome": "/Library/Java/JavaVirtualMachines/openjdk.jdk/Contents/Home",
  // 目前还是需要,后续可能会用 JAVA_HOME 替换
  "java.home": "/Library/Java/JavaVirtualMachines/openjdk.jdk/Contents/Home",
  "java.debug.settings.console": "internalConsole",
  // 终端的 JAVA_HOME
  "terminal.integrated.env.osx": {
    "JAVA_HOME": "/Library/Java/JavaVirtualMachines/openjdk.jdk/Contents/Home"
  },
  "java.configuration.runtimes": [
    {
      "name": "JavaSE-1.8",
      "path": "/Library/Java/JavaVirtualMachines/adoptopenjdk-8.jdk/Contents/Home",
      "default": true
    },
    // 新增 java 17 运行时
    {
      "name": "JavaSE-17",
      "path": "/Library/Java/JavaVirtualMachines/openjdk.jdk/Contents/Home",
    }
  ],

这时 vscode 和我们的项目应该就可以正确识别和使用 jdk 17 了,我们可以从 spring initializr 生一个项目试一下,这里就不赘述了,如果是已经存在的老项目, 可能需要执行一下 Clean Java Language Server Workspace。

回顾

很简单对不对,但是我卡了很久,主要原因就是我以为 jdk 装到哪里,哪里就是 java home, 但其实不对,虽然 vscode 不会报错,但是编译项目的时候一直有问题,后来我注意到 brew 的 caveats,设了软连接,然而 /Library/Java/JavaVirtualMachines/openjdk.jdk 依然不是 java home,还要加上 /Contents/Home,这个是我按照原先 JavaSE-1.8 推测的。

那么现在我推测,如果把 java home 都配置成 /usr/local/opt/openjdk/libexec/openjdk.jdk/Contents/Home, 可能软连接也是多余的了,这个留给你来测试吧,我已经不想再折腾了。