ScalaTest: QuickStart code fails with java.lang.NoClassDefFoundError: scala/xml/NamespaceBinding

ScalaTest: QuickStart code fails with java.lang.NoClassDefFoundError: scala/xml/NamespaceBinding

我刚开始使用 ScalaTest 并关注 http://www.scalatest.org/quick_start

我按照概述的步骤进行操作(通过下载代码上方链接的 jar 文件) 并且代码失败

 unittest vi ExampleSpec.scala
➜  unittest scalac -cp scalatest-app_2.13-3.0.8.jar ExampleSpec.scala
➜  unittest scala -cp scalatest-app_2.13-3.0.8.jar org.scalatest.run ExampleSpec
An exception or error caused a run to abort. This may have been caused by a problematic custom reporter.
java.lang.NoClassDefFoundError: scala/xml/NamespaceBinding
        at org.scalatest.tools.Runner$.doRunRunRunDaDoRunRun(Runner.scala:1368)
        at org.scalatest.tools.Runner$.$anonfun$runOptionallyWithPassFailReporter(Runner.scala:1033)
        at org.scalatest.tools.Runner$.$anonfun$runOptionallyWithPassFailReporter$adapted(Runner.scala:1011)
        at org.scalatest.tools.Runner$.withClassLoaderAndDispatchReporter(Runner.scala:1509)
        at org.scalatest.tools.Runner$.runOptionallyWithPassFailReporter(Runner.scala:1011)
        at org.scalatest.tools.Runner$.main(Runner.scala:827)
        at org.scalatest.run$.main(run.scala:120)
        at org.scalatest.run.main(run.scala)
        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:567)
        at scala.reflect.internal.util.ScalaClassLoader.$anonfun$run(ScalaClassLoader.scala:105)
        at scala.reflect.internal.util.ScalaClassLoader.asContext(ScalaClassLoader.scala:40)
        at scala.reflect.internal.util.ScalaClassLoader.asContext$(ScalaClassLoader.scala:37)
        at scala.reflect.internal.util.ScalaClassLoader$URLClassLoader.asContext(ScalaClassLoader.scala:130)
        at scala.reflect.internal.util.ScalaClassLoader.run(ScalaClassLoader.scala:105)
        at scala.reflect.internal.util.ScalaClassLoader.run$(ScalaClassLoader.scala:97)
        at scala.reflect.internal.util.ScalaClassLoader$URLClassLoader.run(ScalaClassLoader.scala:130)
        at scala.tools.nsc.CommonRunner.run(ObjectRunner.scala:29)
        at scala.tools.nsc.CommonRunner.run$(ObjectRunner.scala:28)
        at scala.tools.nsc.ObjectRunner$.run(ObjectRunner.scala:43)
        at scala.tools.nsc.CommonRunner.runAndCatch(ObjectRunner.scala:35)
        at scala.tools.nsc.CommonRunner.runAndCatch$(ObjectRunner.scala:34)
        at scala.tools.nsc.MainGenericRunner.runTarget(MainGenericRunner.scala:70)
        at scala.tools.nsc.MainGenericRunner.run(MainGenericRunner.scala:91)
        at scala.tools.nsc.MainGenericRunner.process(MainGenericRunner.scala:103)
        at scala.tools.nsc.MainGenericRunner$.main(MainGenericRunner.scala:108)
        at scala.tools.nsc.MainGenericRunner.main(MainGenericRunner.scala)
Caused by: java.lang.ClassNotFoundException: scala.xml.NamespaceBinding
        at java.base/java.net.URLClassLoader.findClass(URLClassLoader.java:436)
        at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:588)
        at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:521)
        ... 29 more

我的 Scala 版本是

➜  unittest scala -version
Scala code runner version 2.13.1 -- Copyright 2002-2019, LAMP/EPFL and Lightbend, Inc.

我认为错误是因为 scala-xml 是一个独立于 Scala 的项目,所以我从 https://mvnrepository.com/artifact/org.scala-lang/scala-xml/2.11.0-M4

下载了 jar 文件

接下来,我再次尝试了整个过程,但失败并出现了不同的错误

 unittest scala -classpath "scalatest-app_2.13-3.0.8.jar:scala-xml-2.11.0-M4.jar" org.scalatest.run ExampleSpec
An exception or error caused a run to abort. This may have been caused by a problematic custom reporter.
java.lang.NoClassDefFoundError: scala/Serializable
        at java.base/java.lang.ClassLoader.defineClass1(Native Method)
        at java.base/java.lang.ClassLoader.defineClass(ClassLoader.java:1016)
        at java.base/java.security.SecureClassLoader.defineClass(SecureClassLoader.java:151)
        at java.base/java.net.URLClassLoader.defineClass(URLClassLoader.java:515)
        at java.base/java.net.URLClassLoader.run(URLClassLoader.java:423)
        at java.base/java.net.URLClassLoader.run(URLClassLoader.java:417)
        at java.base/java.security.AccessController.doPrivileged(AccessController.java:691)
        at java.base/java.net.URLClassLoader.findClass(URLClassLoader.java:416)
        at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:588)
        at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:521)
        at org.scalatest.tools.Runner$.doRunRunRunDaDoRunRun(Runner.scala:1368)
        at org.scalatest.tools.Runner$.$anonfun$runOptionallyWithPassFailReporter(Runner.scala:1033)
        at org.scalatest.tools.Runner$.$anonfun$runOptionallyWithPassFailReporter$adapted(Runner.scala:1011)
        at org.scalatest.tools.Runner$.withClassLoaderAndDispatchReporter(Runner.scala:1509)
        at org.scalatest.tools.Runner$.runOptionallyWithPassFailReporter(Runner.scala:1011)
        at org.scalatest.tools.Runner$.main(Runner.scala:827)
        at org.scalatest.run$.main(run.scala:120)
        at org.scalatest.run.main(run.scala)
        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:567)
        at scala.reflect.internal.util.ScalaClassLoader.$anonfun$run(ScalaClassLoader.scala:105)
        at scala.reflect.internal.util.ScalaClassLoader.asContext(ScalaClassLoader.scala:40)
        at scala.reflect.internal.util.ScalaClassLoader.asContext$(ScalaClassLoader.scala:37)
        at scala.reflect.internal.util.ScalaClassLoader$URLClassLoader.asContext(ScalaClassLoader.scala:130)
        at scala.reflect.internal.util.ScalaClassLoader.run(ScalaClassLoader.scala:105)
        at scala.reflect.internal.util.ScalaClassLoader.run$(ScalaClassLoader.scala:97)
        at scala.reflect.internal.util.ScalaClassLoader$URLClassLoader.run(ScalaClassLoader.scala:130)
        at scala.tools.nsc.CommonRunner.run(ObjectRunner.scala:29)
        at scala.tools.nsc.CommonRunner.run$(ObjectRunner.scala:28)
        at scala.tools.nsc.ObjectRunner$.run(ObjectRunner.scala:43)
        at scala.tools.nsc.CommonRunner.runAndCatch(ObjectRunner.scala:35)
        at scala.tools.nsc.CommonRunner.runAndCatch$(ObjectRunner.scala:34)
        at scala.tools.nsc.MainGenericRunner.runTarget(MainGenericRunner.scala:70)
        at scala.tools.nsc.MainGenericRunner.run(MainGenericRunner.scala:91)
        at scala.tools.nsc.MainGenericRunner.process(MainGenericRunner.scala:103)
        at scala.tools.nsc.MainGenericRunner$.main(MainGenericRunner.scala:108)
        at scala.tools.nsc.MainGenericRunner.main(MainGenericRunner.scala)
Caused by: java.lang.ClassNotFoundException: scala.Serializable
        at java.base/java.net.URLClassLoader.findClass(URLClassLoader.java:436)
        at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:588)
        at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:521)
        ... 39 more

有人可以帮助我了解问题所在吗?

谢谢

更新(已解决)

根据@J0HN 的评论和@Mario 的回答,我能够解决问题

➜  unittest ll
total 17608
-rw-r--r--  1 harit  staff   504B Nov 21 17:15 ExampleSpec.scala
-rw-r--r--@ 1 harit  staff   555K Nov 22 10:35 scala-xml_2.13-1.2.0.jar
-rw-r--r--@ 1 harit  staff   7.9M Nov 21 16:59 scalatest-app_2.13-3.0.8.jar
➜  unittest scalac -classpath "scalatest-app_2.13-3.0.8.jar:scala-xml_2.13-1.2.0.jar" ExampleSpec.scala 
➜  unittest scala -classpath "scalatest-app_2.13-3.0.8.jar:scala-xml_2.13-1.2.0.jar" org.scalatest.run ExampleSpec 
Run starting. Expected test count is: 2
ExampleSpec:
A Stack
- should pop values in last-in-first-out order
- should throw NoSuchElementException if an empty stack is popped
Run completed in 506 milliseconds.
Total number of tests run: 2
Suites: completed 1, aborted 0
Tests: succeeded 2, failed 0, canceled 0, ignored 0, pending 0
All tests passed.
➜  unittest 

我已经从 this 页面

下载了 scala-xml_2.13-1.2.0.jar

Scala 2.13 从标准库中解耦 scala-xml

The following modules are no longer included in the distribution: scala-xml, scala-parser-combinators, scala-swing. They are community-maintained and published to Maven Central.

按照 J0HN 的建议,下载 scala-xml_2.13 并尝试以下命令

scala -cp scalatest-app_2.13-3.0.8.jar:scala-xml_2.13-1.2.0.jar org.scalatest.run ExampleSpec