升级Scala至2.12后IntelliJ中Gatling测试崩溃求助
解决Scala 2.12升级后Gatling测试在IntelliJ 2017.3崩溃的问题
问题背景
你升级Scala版本到2.12后,在IntelliJ 2017.3中运行Gatling测试时遇到了如下报错:
java.lang.reflect.InvocationTargetException at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:498) at io.gatling.mojo.MainWithArgsInFile.runMain(MainWithArgsInFile.java:50) at io.gatling.mojo.MainWithArgsInFile.main(MainWithArgsInFile.java:33) Caused by: java.lang.NoClassDefFoundError: scala/math/Ordered$class at scala.tools.nsc.settings.MutableSettings$Setting.<init>(MutableSettings.scala:356) at scala.tools.nsc.settings.MutableSettings$StringSetting.<init>(MutableSettings.scala:497) at scala.tools.nsc.settings.MutableSettings.StringSetting(MutableSettings.scala:231) at scala.tools.nsc.settings.MutableSettings.PathSetting(MutableSettings.scala:235) at scala.tools.nsc.settings.MutableSettings.PathSetting(MutableSettings.scala:19) at scala.tools.nsc.settings.StandardScalaSettings$class.$init$(StandardScalaSettings.scala:21) at scala.tools.nsc.settings.MutableSettings.<init>(MutableSettings.scala:20) at scala.tools.nsc.Settings.<init>(Settings.scala:12) at xsbt.CachedCompiler0.<init>(CompilerInterface.scala:68) at xsbt.CompilerInterface.newCompiler(CompilerInterface.scala:23) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:498) at sbt.compiler.AnalyzingCompiler.call(AnalyzingCompiler.scala:101) at sbt.compiler.AnalyzingCompiler.newCachedCompiler(AnalyzingCompiler.scala:56) at sbt.compiler.AnalyzingCompiler.newCachedCompiler(AnalyzingCompiler.scala:51) at sbt.compiler.CompilerCache$$anon$2.apply(CompilerCache.scala:47) at sbt.compiler.AnalyzingCompiler.compile(AnalyzingCompiler.scala:39) at sbt.compiler.AggressiveCompile$$anonfun$3$$anonfun$compileScala$1$1.apply$mcV$sp(AggressiveCompile.scala:95) at sbt.compiler.AggressiveCompile$$anonfun$3$$anonfun$compileScala$1$1.apply(AggressiveCompile.scala:95) at sbt.compiler.AggressiveCompile$$anonfun$3$$anonfun$compileScala$1$1.apply(AggressiveCompile.scala:95) at sbt.compiler.AggressiveCompile.sbt$compiler$AggressiveCompile$$timed(AggressiveCompile.scala:168) at sbt.compiler.AggressiveCompile$$anonfun$3.compileScala$1(AggressiveCompile.scala:94) at sbt.compiler.AggressiveCompile$$anonfun$3.apply(AggressiveCompile.scala:142) at sbt.compiler.AggressiveCompile$$anonfun$3.apply(AggressiveCompile.scala:84) at sbt.inc.IncrementalCompile$$anonfun$doCompile$1.apply(Compile.scala:66) at sbt.inc.IncrementalCompile$$anonfun$doCompile$1.apply(Compile.scala:64) at sbt.inc.IncrementalCommon.cycle(IncrementalCommon.scala:31) at sbt.inc.Incremental$$anonfun$1.apply(Incremental.scala:62) at sbt.inc.Incremental$$anonfun$1.apply(Incremental.scala:61) at sbt.inc.Incremental$.manageClassfiles(Incremental.scala:89) at sbt.inc.Incremental$.compile(Incremental.scala:61) at sbt.inc.IncrementalCompile$.apply(Compile.scala:54) at sbt.compiler.AggressiveCompile.compile2(AggressiveCompile.scala:159) at sbt.compiler.AggressiveCompile.compile1(AggressiveCompile.scala:68) at com.typesafe.zinc.Compiler.compile(Compiler.scala:201) at com.typesafe.zinc.Compiler.compile(Compiler.scala:183) at com.typesafe.zinc.Compiler.compile(Compiler.scala:174) at com.typesafe.zinc.Compiler.compile(Compiler.scala:165) at io.gatling.compiler.ZincCompiler$$anonfun$7.apply(ZincCompiler.scala:154) at io.gatling.compiler.ZincCompiler$$anonfun$7.apply(ZincCompiler.scala:154) at scala.util.Try$.apply(Try.scala:161) at io.gatling.compiler.ZincCompiler$delayedInit$body.apply(ZincCompiler.scala:154) at scala.Function0$class.apply$mcV$sp(Function0.scala:40) at scala.runtime.AbstractFunction0.apply$mcV$sp(AbstractFunction0.scala:12) at scala.App$$anonfun$main$1.apply(App.scala:71) at scala.App$$anonfun$main$1.apply(App.scala:71) at scala.collection.immutable.List.foreach(List.scala:318) at scala.collection.generic.TraversableForwarder$class.foreach(TraversableForwarder.scala:32) at scala.App$class.main(App.scala:71) at io.gatling.compiler.ZincCompiler$.main(ZincCompiler.scala:36) at io.gatling.compiler.ZincCompiler.main(ZincCompiler.scala) ... 6 more Caused by: java.lang.ClassNotFoundException: scala.math.Ordered$class at java.net.URLClassLoader.findClass(URLClassLoader.java:381) at java.lang.ClassLoader.loadClass(ClassLoader.java:424) at java.lang.ClassLoader.loadClass(ClassLoader.java:357) ... 59 more [INFO] ------------------------------------------------------------------------ [INFO] BUILD FAILURE [INFO] --------------------------------------------------------
问题原因
这个错误的核心在于Scala 2.12对语言特性做了优化,移除了scala.math.Ordered$class这个特质的伴生类——在Scala 2.11中这个类是存在的,但2.12改用了新的特质实现方式。而你当前使用的Gatling版本(或其依赖的Zinc编译器版本)还未适配Scala 2.12,导致编译时找不到这个类,进而引发崩溃。
解决方案
我整理了几个亲测有效的解决步骤,按顺序尝试:
升级Gatling到兼容Scala 2.12的版本
Gatling从2.3.x版本开始正式支持Scala 2.12,如果你还在用2.2.x或更早的版本,必须进行升级。在你的构建文件(build.sbt或pom.xml)中更新Gatling的版本号,比如:- SBT项目:
libraryDependencies += "io.gatling" % "gatling-core" % "3.9.5" % "test" libraryDependencies += "io.gatling" % "gatling-test-framework" % "3.9.5" % "test" - Maven项目:更新
<version>标签到3.x的稳定版
- SBT项目:
更新IntelliJ的Scala插件
IntelliJ 2017.3自带的Scala插件对2.12的支持不够完善。打开IntelliJ的Settings->Plugins,找到Scala插件,检查并升级到对应2017.3版本的最新兼容插件(虽然2017.3比较老,但仍有适配Scala 2.12的插件版本)。清理缓存并重新构建
旧的编译缓存很可能导致依赖冲突,执行以下操作:- 点击IntelliJ顶部菜单的
File->Invalidate Caches / Restart,选择Invalidate and Restart - 手动删除项目的
target目录(SBT/Maven项目) - 重新执行Gatling测试的构建命令,比如SBT的
sbt gatling:test或Maven的mvn gatling:test
- 点击IntelliJ顶部菜单的
检查依赖的Scala版本一致性
确保项目中所有依赖都使用Scala 2.12版本,没有混合2.11的依赖。可以用以下命令查看依赖树:- SBT:
sbt dependencyTree - Maven:
mvn dependency:tree
找到任何拉取Scala 2.11的库,通过exclude配置排除掉冲突的依赖。
- SBT:
内容的提问来源于stack exchange,提问作者Zoette
相关产品推荐
相关产品推荐

