6
votes

SBT échoue avec `String.class is broken`

sbt échoue avec une erreur cryptique lors de l'émission de toute commande ( compile , assembly , clean ou autre).

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

Je suis sur une machine exécutant macOS et sbt été installé via homebrew . J'ai essayé de passer aux dernières versions de sbt ( 1.3.10 ), mais l'erreur persiste.


3 commentaires

Où (dans quel répertoire) avez-vous exécuté la commande sbt? si vous utilisez un projet sbt, vérifiez la version sbt dans project/build.properties


Quel JDK avez-vous installé?


Salut, le problème semble être dû au fait que JDK 13 est devenu la version JDK par défaut dans homebrew . J'ai publié une solution ci-dessous.


4 Réponses :


11
votes

Le problème est documenté sur la page de téléchargement SBT .

Les responsables de Homebrew ont ajouté une dépendance au JDK 13 parce qu'ils veulent utiliser plus de dépendances de brew ( brew # 50649 ). Cela amène sbt à utiliser le JDK 13 même lorsque java disponible sur PATH est JDK 8 ou 11. Pour empêcher sbt de s'exécuter sur JDK 13, installez jEnv ou passez à l'utilisation de SDKMAN .

J'ai pu résoudre le problème en utilisant JDK 8 via jEnv .


1 commentaires

n'a pas fonctionné pour moi, mais l'autre réponse sur le changement de JDK dans les configs sbt a résolu le problème dans mon cas.



9
votes

Depuis sbt documente les JDK 8 et 11 comme versions compatibles

Nous recommandons AdoptOpenJDK JDK 8 ou AdoptOpenJDK JDK 11

essayez de contrôler quel JDK est utilisé par sbt via le -java-home qui peut être configuré à l'échelle du système via sbtopts run configuration

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

ou par projet via

<project-root>/.sbtopts

Par exemple, pour configurer le JDK utilisé par sbt dans le projet actuel, essayez de définir dans .sbtopts

/usr/local/etc/sbtopts


0 commentaires

0
votes

J'ai eu le même problème récemment. Ce qui a fonctionné pour moi, c'est d'installer SDKMAN ( https://sdkman.io/ )

sdk install java 11.0.3.hs-adpt

Après l'installation, je voulais voir quelles versions de Java je pouvais installer. Je lance donc simplement cette commande pour lister toutes les versions disponibles de Java

sdk list java

Choisissez la version que vous souhaitez installer (recommandez d'installer 8 ou 11 comme mentionné ci-dessus) et exécutez simplement la commande avec l'identifiant qui spécifie votre version dans la liste

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

Après l'installation, il a défini Java 11 par défaut sur mon système. J'ai ensuite exécuté à nouveau la commande sbt et cela a fonctionné.


0 commentaires

0
votes

C'est ce qui a résolu mon problème sur mon Mac.

sdk install sbt

Installez sdkman

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

Installez sbt via sdk

brew uninstall sbt


0 commentaires