Scala 3.0.0-M2环境下Sbt运行测试找不到List类定义如何解决
Scala 3项目sbt test运行报错问题
问题背景
在Intellij IDEA Ultimate中基于JDK 16使用sbt搭建Scala项目,build.sbt配置如下:
name := "meteo-france-client" version := "0.1" scalaVersion := "3.0.0-M2" libraryDependencies += "org.scalatest" %% "scalatest" % "3.3.0-SNAP3" % Test
测试代码位于src/scala/test/MainTest.scala,内容如下:
import org.scalatest.funsuite.AnyFunSuite class MainTest extends AnyFunSuite { test("Example") { assert(1 == 1) } }
问题现象
- 项目主代码可正常编译,但IDE中scalatest导入语句和
test方法名标红,提示找不到对应符号 - 执行
sbt test命令时抛出如下错误:
[info] compiling 1 Scala source to C:\Users\adrie\OneDrive\Documents\dev\meteo-france-client\target\scala-3.0.0-M2\test-classes ... [error] ## Exception when compiling 1 sources to C:\Users\adrie\OneDrive\Documents\dev\meteo-france-client\target\scala-3.0.0-M2\test-classes [error] java.lang.NoClassDefFoundError: scala/collection/immutable/List [error] xsbt.CachedCompilerImpl.run(CachedCompilerImpl.java:65) [error] xsbt.CompilerInterface.run(CompilerInterface.java:41) [error] java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) [error] java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:78) [error] java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) [error] java.base/java.lang.reflect.Method.invoke(Method.java:567) [error] sbt.internal.inc.AnalyzingCompiler.invoke(AnalyzingCompiler.scala:329) [error] sbt.internal.inc.AnalyzingCompiler.compile(AnalyzingCompiler.scala:112) [error] sbt.internal.inc.MixedAnalyzingCompiler.$anonfun$compile$7(MixedAnalyzingCompiler.scala:192) [error] scala.runtime.java8.JFunction0$mcV$sp.apply(JFunction0$mcV$sp.java:23) [error] sbt.internal.inc.MixedAnalyzingCompiler.timed(MixedAnalyzingCompiler.scala:247) [error] sbt.internal.inc.MixedAnalyzingCompiler.$anonfun$compile$4(MixedAnalyzingCompiler.scala:182) [error] sbt.internal.inc.MixedAnalyzingCompiler.$anonfun$compile$4$adapted(MixedAnalyzingCompiler.scala:163) [error] sbt.internal.inc.JarUtils$.withPreviousJar(JarUtils.scala:239) [error] sbt.internal.inc.MixedAnalyzingCompiler.compileScala$1(MixedAnalyzingCompiler.scala:163) [error] sbt.internal.inc.MixedAnalyzingCompiler.compile(MixedAnalyzingCompiler.scala:210) [error] sbt.internal.inc.IncrementalCompilerImpl.$anonfun$compileInternal$1(IncrementalCompilerImpl.scala:528) [error] sbt.internal.inc.IncrementalCompilerImpl.$anonfun$compileInternal$1$adapted(IncrementalCompilerImpl.scala:528) [error] sbt.internal.inc.Incremental$.$anonfun$apply$5(Incremental.scala:175) [error] sbt.internal.inc.Incremental$.$anonfun$apply$5$adapted(Incremental.scala:173) [error] sbt.internal.inc.Incremental$$anon$2.run(Incremental.scala:459) [error] sbt.internal.inc.IncrementalCommon$CycleState.next(IncrementalCommon.scala:116) [error] sbt.internal.inc.IncrementalCommon$$anon$1.next(IncrementalCommon.scala:56) [error] sbt.internal.inc.IncrementalCommon$$anon$1.next(IncrementalCommon.scala:52) [error] sbt.internal.inc.IncrementalCommon.cycle(IncrementalCommon.scala:263) [error] sbt.internal.inc.Incremental$.$anonfun$incrementalCompile$8(Incremental.scala:414) [error] sbt.internal.inc.Incremental$.withClassfileManager(Incremental.scala:501) [error] sbt.internal.inc.Incremental$.incrementalCompile(Incremental.scala:401) [error] sbt.internal.inc.Incremental$.apply(Incremental.scala:167) [error] sbt.internal.inc.IncrementalCompilerImpl.compileInternal(IncrementalCompilerImpl.scala:528) [error] sbt.internal.inc.IncrementalCompilerImpl.$anonfun$compileIncrementally$1(IncrementalCompilerImpl.scala:482) [error] sbt.internal.inc.IncrementalCompilerImpl.handleCompilationError(IncrementalCompilerImpl.scala:332) [error] sbt.internal.inc.IncrementalCompilerImpl.compileIncrementally(IncrementalCompilerImpl.scala:420) [error] sbt.internal.inc.IncrementalCompilerImpl.compile(IncrementalCompilerImpl.scala:137) [error] sbt.Defaults$.compileIncrementalTaskImpl(Defaults.scala:2357) [error] sbt.Defaults$.$anonfun$compileIncrementalTask$2(Defaults.scala:2314) [error] sbt.internal.io.Retry$.apply(Retry.scala:46) [error] sbt.internal.io.Retry$.apply(Retry.scala:28) [error] sbt.internal.io.Retry$.apply(Retry.scala:23) [error] sbt.internal.server.BspCompileTask$.compute(BspCompileTask.scala:31) [error] sbt.Defaults$.$anonfun$compileIncrementalTask$1(Defaults.scala:2310) [error] scala.Function1.$anonfun$compose$1(Function1.scala:49) [error] sbt.internal.util.$tilde$greater.$anonfun$$u2219$1(TypeFunctions.scala:62) [error] sbt.std.Transform$$anon$4.work(Transform.scala:68) [error] sbt.Execute.$anonfun$submit$2(Execute.scala:282) [error] sbt.internal.util.ErrorHandling$.wideConvert(ErrorHandling.scala:23) [error] sbt.Execute.work(Execute.scala:291) [error] sbt.Execute.$anonfun$submit$1(Execute.scala:282) [error] sbt.ConcurrentRestrictions$$anon$4.$anonfun$submitValid$1(ConcurrentRestrictions.scala:265) [error] sbt.CompletionService$$anon$2.call(CompletionService.scala:64) [error] java.base/java.util.concurrent.FutureTask.run(FutureTask.java:264) [error] java.base/java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:515) [error] java.base/java.util.concurrent.FutureTask.run(FutureTask.java:264) [error] java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1130) [error] java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:630) [error] java.base/java.lang.Thread.run(Thread.java:831) [error] [error] stack trace is suppressed; run 'last Test / compileIncremental' for the full output [error] (Test / compileIncremental) java.lang.NoClassDefFoundError: scala/collection/immutable/List [error] Total time: 0 s, completed 26 nov. 2021, 13:33:34
错误原因
你关于Scala 3.0.0-M2移除List类的猜测不成立,scala.collection.immutable.List是Scala核心集合类,所有版本均不会移除该类。
本次错误的根本原因为版本兼容性问题:
- Scala 3.0.0-M2属于早期非正式里程碑版本,本身稳定性不足,与JDK 16、配套的sbt编译器桥接组件、ScalaTest 3.3.0-SNAP3快照版本均存在兼容性冲突
- 测试编译阶段,不同版本依赖的Scala标准库出现类路径冲突,导致编译器无法正确加载核心类定义,抛出类未找到错误
- IDE中标红的原因是IntelliJ IDEA对非稳定的Scala 3里程碑版本支持不完善,加上依赖版本不匹配无法完成正确的符号索引
解决方案
- 将build.sbt中的Scala版本升级为正式稳定版,建议使用3.2.0及以上版本:
scalaVersion := "3.2.1" - 替换ScalaTest依赖为支持Scala 3的正式稳定版,例如:
libraryDependencies += "org.scalatest" %% "scalatest" % "3.2.15" % Test - 打开
project/build.properties文件,将sbt版本设置为1.7.0及以上,确保对Scala 3和JDK 16的兼容:sbt.version=1.8.2 - 完成修改后执行
sbt clean reload update命令,再在IDEA中重新加载项目,即可解决依赖标红和测试运行报错问题
内容的提问来源于stack exchange,提问作者Karzyfox
相关产品推荐
相关产品推荐

