SBT 失败并显示 `String.class is broken`。

18

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 是通过 homebrew 安装的。我尝试升级到最新版本的 sbt1.3.10),但错误仍然存在。


你在哪个目录下运行了sbt命令?如果你是在一个sbt项目中运行的,请在project/build.properties中检查sbt版本。 - Bob
你安装了哪个JDK? - Luis Miguel Mejía Suárez
嗨,问题似乎是由于JDK 13成为“homebrew”中默认的JDK版本所致。我在下面发布了一个解决方案。 - suj1th
5个回答

20
问题在SBT下载页面有记录。

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

我通过使用jEnv解决了问题。


4
对我没有用,但是另一个回答提到在 sbt 配置中更改 JDK 解决了我的问题。 - YAPPO

14

由于 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

这对我来说是100%的解决方案,在/usr/local/etc/sbtopts底部添加-java-home /Library/Java/JavaVirtualMachines/openjdk-8.jdk/Contents/Home。您还可以在/usr/libexec/java_home中查看系统使用的JDK,以查看它是否使用与您期望不同的JDK。您希望两者都是相同的Java版本。 - Alex W

7

最近我也遇到了同样的问题。 对我有用的是安装 SDKMANhttps://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命令,它就可以工作了。

7

以下是在我的 Mac 上解决问题的方法。

brew uninstall sbt

安装sdkman

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

通过sdk安装sbt

sdk install sbt

1
如果您正在使用SDKMAN,那么在某些情况下,来自不同供应商的某些版本的Java(即JDK)可能会有所帮助。
例如,我之前使用Amazon Correto JDK8(版本8.332.08.1-amzn),但它不能正常构建我的IntellIJ IDEA sbt项目,因此我切换到使用Zulu的JDK8(版本8.0.332-zulu)作为默认的Java版本。
希望这能有所帮助,祝你好运。 :)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接