假设我使用标准文件夹结构在Scala中有一个典型的框架应用程序。我想在CI服务器上运行我的编译测试 - 这些测试存在于/ tests文件夹中。
当我按照以下详细说明运行最新的运行时:http://www.scalatest.org/user_guide/using_the_runner并使用以下命令行命令:
scala -classpath /home/vagrant/.ivy2/ org.scalatest.tools.Runner -R target
我收到以下错误:
java.lang.NoClassDefFoundError: scala/concurrent/duration/Duration
at org.scalatest.tools.Runner$.<init>(Runner.scala:741
据我所知,它告诉我它找不到作为测试一部分所需的持续时间等级。我也明白,这可能是因为该类不在类路径上,但我不知道如何指定传递给运行器的类路径。
我尝试过指定“target”的类路径,如下所示:
scala -classpath /home/vagrant/.ivy2/cache/org.scalatest/scalatest_2.10/jars/scalatest_2.10-2.0.M8.jar:target org.scalatest.tools.Runner -R target
“target”文件夹是为play框架添加已编译的应用程序和测试的位置。我正在从项目的根目录运行该命令,因此target是一个有效的文件路径。
看起来我对类路径的工作原理有了根本的差距。
修改 我通过手动将scala lang jar添加到包含持续时间类的类路径中取得了一些成功。但是如何将所有jar添加到类路径中?有通配符语法吗?
scala -classpath "/home/vagrant/.ivy2/cache/org.scalatest/scalatest_2.10/jars/scalatest_2.10-2.0.M8.jar:/home/vagrant/.ivy2/cache/org.scala-lang/scala-library/jars/scala-library-2.10.3.jar" org.scalatest.tools.Runner -R target
java.lang.IncompatibleClassChangeError: Found class scala.collection.mutable.ArrayOps, but interface was expected
答案 0 :(得分:2)
以下是使用Runner
运行测试套件的方法:
Compile tests with SBT and package them to be run later
以下是如何轻松地将多个jar文件添加到类路径中:
答案 1 :(得分:2)
使用以下命令获取所有依赖项的类路径:
DEPS=$(sbt --error "export compile:dependencyClasspath")
然后运行测试:
java -cp "<path to scalatest.jar>":$DEPS org.scalatest.tools.Runner -R target
其中<path to scalatest.jar>
类似于/home/user/project/.ivy2/cache/org.scalatest/scalatest_2.11/bundles/scalatest_2.11-2.2.6.jar
。
是的,您可以使用java
,而不是scala
,因为$DEPS
已包含所有Scala库。