我在尝试升级当前 sbt 版本时遇到问题 (
1.6.2
)。我尝试了1.8.3
和1.9.3
下面的错误输出是从
1.9.3
尝试中获得的:
java.lang.NoClassDefFoundError: okhttp3/Interceptor
at java.base/java.lang.Class.forName0(Native Method)
at java.base/java.lang.Class.forName(Class.java:398)
at sbt.internal.inc.ModuleUtilities$.getObject(ModuleUtilities.scala:24)
at sbt.internal.inc.ModuleUtilities$.getCheckedObject(ModuleUtilities.scala:32)
at sbt.internal.inc.ModuleUtilities$.$anonfun$getCheckedObjects$1(ModuleUtilities.scala:37)
at scala.collection.immutable.Stream.$anonfun$map$1(Stream.scala:418)
at scala.collection.immutable.Stream$Cons.tail(Stream.scala:1173)
at scala.collection.immutable.Stream$Cons.tail(Stream.scala:1163)
at scala.collection.generic.Growable.loop$1(Growable.scala:57)
at scala.collection.generic.Growable.$plus$plus$eq(Growable.scala:61)
at scala.collection.generic.Growable.$plus$plus$eq$(Growable.scala:53)
at scala.collection.mutable.ListBuffer.$plus$plus$eq(ListBuffer.scala:184)
at scala.collection.mutable.ListBuffer.$plus$plus$eq(ListBuffer.scala:47)
at scala.collection.TraversableLike.to(TraversableLike.scala:786)
at scala.collection.TraversableLike.to$(TraversableLike.scala:783)
at scala.collection.AbstractTraversable.to(Traversable.scala:108)
at scala.collection.TraversableOnce.toList(TraversableOnce.scala:350)
at scala.collection.TraversableOnce.toList$(TraversableOnce.scala:350)
at scala.collection.AbstractTraversable.toList(Traversable.scala:108)
at scala.collection.immutable.List.$plus$plus(List.scala:216)
at sbt.internal.PluginDiscovery$.discoverAll(PluginDiscovery.scala:59)
at sbt.internal.Load$.loadPlugins(Load.scala:1330)
at sbt.internal.Load$.loadPluginDefinition(Load.scala:1275)
at sbt.internal.Load$.buildPlugins(Load.scala:1254)
at sbt.internal.Load$.plugins(Load.scala:1233)
at sbt.internal.Load$.$anonfun$loadUnit$2(Load.scala:701)
at sbt.internal.Load$.timed(Load.scala:1407)
at sbt.internal.Load$.$anonfun$loadUnit$1(Load.scala:701)
at sbt.internal.Load$.timed(Load.scala:1407)
at sbt.internal.Load$.loadUnit(Load.scala:695)
at sbt.internal.Load$.$anonfun$builtinLoader$4(Load.scala:493)
at sbt.internal.BuildLoader$.$anonfun$componentLoader$5(BuildLoader.scala:181)
at sbt.internal.BuildLoader.apply(BuildLoader.scala:246)
at sbt.internal.Load$.loadURI$1(Load.scala:555)
at sbt.internal.Load$.loadAll(Load.scala:571)
at sbt.internal.Load$.loadURI(Load.scala:501)
at sbt.internal.Load$.load(Load.scala:480)
at sbt.internal.Load$.$anonfun$apply$1(Load.scala:242)
at sbt.internal.Load$.timed(Load.scala:1407)
at sbt.internal.Load$.apply(Load.scala:242)
at sbt.internal.Load$.defaultLoad(Load.scala:57)
at sbt.BuiltinCommands$.liftedTree1$1(Main.scala:964)
at sbt.BuiltinCommands$.doLoadProject(Main.scala:964)
at sbt.BuiltinCommands$.$anonfun$loadProjectImpl$2(Main.scala:917)
at sbt.Command$.$anonfun$applyEffect$4(Command.scala:151)
at sbt.Command$.$anonfun$applyEffect$2(Command.scala:146)
at sbt.Command$.process(Command.scala:190)
at sbt.MainLoop$.$anonfun$processCommand$5(MainLoop.scala:246)
at scala.Option.getOrElse(Option.scala:189)
at sbt.MainLoop$.process$1(MainLoop.scala:246)
at sbt.MainLoop$.processCommand(MainLoop.scala:279)
at sbt.MainLoop$.$anonfun$next$5(MainLoop.scala:164)
at sbt.State$StateOpsImpl$.runCmd$1(State.scala:290)
at sbt.State$StateOpsImpl$.process$extension(State.scala:326)
at sbt.MainLoop$.$anonfun$next$4(MainLoop.scala:164)
at sbt.internal.util.ErrorHandling$.wideConvert(ErrorHandling.scala:24)
at sbt.MainLoop$.next(MainLoop.scala:164)
at sbt.MainLoop$.run(MainLoop.scala:145)
at sbt.MainLoop$.$anonfun$runWithNewLog$1(MainLoop.scala:120)
at sbt.io.Using.apply(Using.scala:28)
at sbt.MainLoop$.runWithNewLog(MainLoop.scala:113)
at sbt.MainLoop$.runAndClearLast(MainLoop.scala:67)
at sbt.MainLoop$.runLoggedLoop(MainLoop.scala:52)
at sbt.MainLoop$.runLogged(MainLoop.scala:43)
at sbt.StandardMain$.runManaged(Main.scala:225)
at sbt.xMain$.$anonfun$run$11(Main.scala:135)
at scala.util.DynamicVariable.withValue(DynamicVariable.scala:62)
at scala.Console$.withIn(Console.scala:230)
at sbt.internal.util.Terminal$.withIn(Terminal.scala:610)
at sbt.internal.util.Terminal$.$anonfun$withStreams$1(Terminal.scala:390)
at scala.util.DynamicVariable.withValue(DynamicVariable.scala:62)
at scala.Console$.withOut(Console.scala:167)
at sbt.internal.util.Terminal$.$anonfun$withOut$2(Terminal.scala:600)
at scala.util.DynamicVariable.withValue(DynamicVariable.scala:62)
at scala.Console$.withErr(Console.scala:196)
at sbt.internal.util.Terminal$.withOut(Terminal.scala:600)
at sbt.internal.util.Terminal$.withStreams(Terminal.scala:390)
at sbt.xMain$.withStreams$1(Main.scala:88)
at sbt.xMain$.run(Main.scala:123)
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.base/java.lang.reflect.Method.invoke(Method.java:566)
at sbt.internal.XMainConfiguration.run(XMainConfiguration.java:59)
at sbt.xMain.run(Main.scala:47)
at xsbt.boot.Launch$.$anonfun$run$1(Launch.scala:149)
at xsbt.boot.Launch$.withContextLoader(Launch.scala:176)
at xsbt.boot.Launch$.run(Launch.scala:149)
at xsbt.boot.Launch$.$anonfun$apply$1(Launch.scala:44)
at xsbt.boot.Launch$.launch(Launch.scala:159)
at xsbt.boot.Launch$.apply(Launch.scala:44)
at xsbt.boot.Launch$.apply(Launch.scala:21)
at xsbt.boot.Boot$.runImpl(Boot.scala:78)
at xsbt.boot.Boot$.run(Boot.scala:73)
at xsbt.boot.Boot$.main(Boot.scala:21)
at xsbt.boot.Boot.main(Boot.scala)
Caused by: java.lang.ClassNotFoundException: okhttp3.Interceptor
at java.base/java.net.URLClassLoader.findClass(URLClassLoader.java:476)
at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:589)
at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:522)
... 96 more
JDK版本:11.0.19-tem(来自SDKMAN) 我使用了IntelliJ的sbt shell(2023.1.2 UE Build #IU-231.9011.34)
开始加载项目确认sbt和JDK版本:
$USER_HOME/.sdkman/candidates/java/11.0.19-tem/bin/java -Djline.terminal=jline.UnsupportedTerminal -Dsbt.log.noformat=true -Dfile.encoding=UTF-8 -Xss256m -Didea.managed=true -Dfile.encoding=UTF-8 -Didea.installation.dir=$USER_HOME/Library/Application Support/JetBrains/Toolbox/apps/IDEA-U/ch-0/231.9011.34/IntelliJ IDEA.app/Contents -jar $USER_HOME/Library/Application Support/JetBrains/Toolbox/apps/IDEA-U/ch-0/231.9011.34/IntelliJ IDEA.app.plugins/Scala/launcher/sbt-launch.jar
[info] welcome to sbt 1.9.3 (Eclipse Adoptium Java 11.0.19)
另一个观察结果是,根据 IntelliJ 的项目视图,导致反射错误的内部文件(来自
ModuleUtilities.scala
的 zinc-classpath
)的版本为 2.12-1.6.0,但是查看 at MVNRepo 它应该与 sbt 版本对齐。这可能更多是升级失败的症状:
更新 不幸的是,当使用 CLI 从存储库根目录执行 sbt --version
时,我得到了相同的输出:
➜ sbt --version
// same error output as above
sbt script version: 1.9.3
我可以在项目视图的 IntelliJ 库部分的 okhttp3.Interceptor
下的
okhttp-3.14.2.jar
中看到
sbt-1.9.3
,但自版本
okhttp
以来,似乎
1.7.0
应该已被 删除。我也没有在使用 Coursier 的 sbt 1.9.3 版本中看到
okhttp3
依赖项:
➜ 1.0 cs resolve -t org.scala-sbt:sbt:1.9.3 | grep okhttp
Result:
JIC,我们的解决者:
resolvers ++= Resolver.sonatypeOssRepos("releases")
更新还有这个
resolvers ++= Seq(
"Typesafe Repo" at "https://repo.typesafe.com/typesafe/releases/",
"osgeo" at "https://repo.osgeo.org/repository/release/"
)
build.properties
文件:
sbt.version=1.9.3
FWIW 同样的错误发生在 CD 管道 (gitlab) 的一部分。这些是我们用于 Gitlab 运行程序的图像(我们使用 1.8.2):
SBT_IMAGE_11: sbtscala/scala-sbt:eclipse-temurin-11.0.17_8_1.8.2_2.13.10
SBT_IMAGE_8: sbtscala/scala-sbt:eclipse-temurin-8u352-b08_1.8.2_2.13.10
预期的 sbt 版本也在那里下载:
[info] [launcher] getting org.scala-sbt sbt 1.9.3 (this may take some time)...
[info] [launcher] getting Scala 2.12.18 (for sbt)...
[info] welcome to sbt 1.9.3 (Red Hat, Inc. Java 1.8.0_342)
如果有任何指导帮助,我将不胜感激。
"com.gilcloud" % "sbt-gitlab" % "0.0.6"
依赖关系。将该插件升级到版本
0.1.2
解决了该问题。好吧,差不多了..:如果您有
sbt 多项目构建(就像我们一样),请注意,除了升级版本之外,您还必须将 gitlab 设置移动到每个子项目,例如
// in build.sbt
lazy val gitlabSettings = Seq(
...
GitlabPlugin.autoImport.gitlabDomain := "gitlab.com",
GitlabPlugin.autoImport.gitlabProjectId := ...
GitlabPlugin.autoImport.gitlabCredentials := ...
)
lazy val module1 = (project in file("module1"))
.settings(
name := "module1",
sharedSettings
)
从历史的角度来看,我是如何找到罪魁祸首的可能很有趣:我首先将缺少的类定义的工件添加到
project/plugins.sbt
(升级 sbt-gitlab 插件后你将不再需要它):
// in project/plugins.sbt
libraryDependencies ++= Seq("com.squareup.okhttp3" % "okhttp" % "4.11.0")
此时 sbt 错误变得更具指示性 - 它开始抱怨 sbt.internal.CustomHTTP
包中的类缺少
com.gilcloud
依赖项。这促使我访问该插件的发布页面,在那里我找到了有关其修复 sbt 1.7.0+ 版本的注释。