SBT 失败,并显示"字符串.class已损坏"



sbt在发出任何命令(compileassemblyclean或任何其他命令)时都会失败并出现一个神秘的错误。

$ sbt --version                                                                                                                                                          
error: error while loading String, class file '/modules/java.base/java/lang/String.class' is broken
(class java.lang.NullPointerException/null)

我在一台运行macOS的机器上,sbt是通过自制软件安装的。我尝试升级到最新版本的sbt(1.3.10),但错误仍然存在。

此问题记录在 SBT 下载页面上。

自制软件维护者为 JDK 13 添加了一个依赖项,因为他们希望使用更多的 brew 依赖项 (brew#50649)。这会导致 sbt 使用 JDK 13,即使 PATH 上可用的 Java 是 JDK 8 或 11。要防止 sbt 在 JDK 13 上运行,请安装 jEnv 或切换到使用 SDKMAN。

我能够通过jEnv使用 JDK 8 来解决问题。

由于 sbt 将 JDK 8 和 11 文档为兼容版本

我们建议采用 AdoptOpenJDK JDK 8 或 AdoptOpenJDK JDK 11

尝试通过-java-home设置控制 SBT 使用哪个 JDK,该设置可以通过sbtopts运行配置在系统范围内进行配置

/usr/local/etc/sbtopts

或按项目通过


<project-root>/.sbtopts

例如,要在当前项目中配置 sbt 使用的 JDK,请尝试在.sbtopts

-java-home /Users/picard/.sdkman/candidates/java/current

我最近遇到了同样的问题。对我有用的是安装SDKMAN(https://sdkman.io/)

$ curl -s "https://get.sdkman.io" | bash
...
$ source "$HOME/.sdkman/bin/sdkman-init.sh"
...

安装后,我想看看我可以安装哪些版本的 Java。所以我只需运行这个命令来列出所有可用的 Java 版本

sdk list java

选择要安装的版本(如上所述,建议安装 8 或 11),然后只需使用从列表中指定版本的标识符运行命令

sdk install java 11.0.3.hs-adpt

安装后,它将我的系统上的 Java 11 设置为默认值。然后我再次运行sbt命令,它起作用了。

这就是解决我在Mac上的问题的原因。

brew uninstall sbt

安装 sdkman

curl -s "https://get.sdkman.io" | bash
source "$HOME/.sdkman/bin/sdkman-init.sh"

通过 sdk 安装 sbt

sdk install sbt

如果您使用的是SDKMAN,那么在某些情况下,来自不同供应商的某些版本的Java(即JDK)可能会有所帮助。

例如,我使用的是 Amazon Correto JDK8(版本8.332.08.1-amzn),它无法在 IntellIJ IDEA 中正确构建我的 sbt 项目,所以我改用 Zulu 的 JDK8(版本8.0.332-zulu)作为默认的 java 版本。

希望这有帮助,祝你好运。 :)

最新更新