如何在使用ScalaTest运行程序时设置类路径

时间:2014-02-27 17:13:12

标签: java scala classpath sbt scalatest

假设我使用标准文件夹结构在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

2 个答案:

答案 0 :(得分:2)

以下是使用Runner运行测试套件的方法:

Compile tests with SBT and package them to be run later

以下是如何轻松地将多个jar文件添加到类路径中:

Run scala console with play 2.2 jars

答案 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库。