Scala sbt测试中与正常模式下不同的库相关性

Scala sbt测试中与正常模式下不同的库相关性,scala,playframework,sbt,typesafe-activator,typesafe,Scala,Playframework,Sbt,Typesafe Activator,Typesafe,由于冲突/可传递(elasticsearch/lucene/jackrabbit)依赖关系,我希望测试中的libraryDependencies与正常运行应用程序时不同。我通过下面的设置解决了这个问题,但这需要运行带-Dtest的activator,这将阻止我的应用程序在完成测试后正常运行。另一种方法,即仅运行activator,将运行我的应用程序,但不会运行我的测试。所以,不是很方便,我认为这可以做得更好(顺便说一句,我对sbt/scala非常陌生) 我没有一个可以真正测试这是否有效的设置,但

由于冲突/可传递(elasticsearch/lucene/jackrabbit)依赖关系,我希望测试中的libraryDependencies与正常运行应用程序时不同。我通过下面的设置解决了这个问题,但这需要运行带-Dtest的activator,这将阻止我的应用程序在完成测试后正常运行。另一种方法,即仅运行activator,将运行我的应用程序,但不会运行我的测试。所以,不是很方便,我认为这可以做得更好(顺便说一句,我对sbt/scala非常陌生)


我没有一个可以真正测试这是否有效的设置,但从我对sbt依赖性的理解来看,它应该:

依赖项可以有一种称为配置的作用域。通常,这用于定义仅测试依赖项:

"com.typesafe.akka" %  "akka-testkit_2.11" % "2.3.14" % "test"
但您还应该能够使用“compile”和“runtime”来定义编译时和仅运行时依赖项

如果我使用不同版本的依赖项,sbt会打印一条警告。问题是,这将使用不同版本的依赖项来编译它,然后用测试运行它。因此,它将运行在与编译时使用的版本不同的版本上。当然也有一些库,这些库可以工作,特别是如果您使用的是一个更新的版本,而您使用的是编译

如果您真的需要编译两次具有不同依赖关系的应用程序,并使用一个构建运行,一个构建测试,我担心,如果不扩展sbt或类似的东西,就不会有解决方案


您可以尝试创建两个模块,一个包含主代码,另一个用于测试,然后尝试交叉构建第一个模块的两个不同版本。Sbt可以很容易地跨多个Scala版本进行交叉构建,但我不认为它可以对一个库的多个版本进行开箱即用。

我没有一个可以真正测试这是否有效的设置,但从我对Sbt依赖性的理解来看,它应该:

依赖项可以有一种称为配置的作用域。通常,这用于定义仅测试依赖项:

"com.typesafe.akka" %  "akka-testkit_2.11" % "2.3.14" % "test"
但您还应该能够使用“compile”和“runtime”来定义编译时和仅运行时依赖项

如果我使用不同版本的依赖项,sbt会打印一条警告。问题是,这将使用不同版本的依赖项来编译它,然后用测试运行它。因此,它将运行在与编译时使用的版本不同的版本上。当然也有一些库,这些库可以工作,特别是如果您使用的是一个更新的版本,而您使用的是编译

如果您真的需要编译两次具有不同依赖关系的应用程序,并使用一个构建运行,一个构建测试,我担心,如果不扩展sbt或类似的东西,就不会有解决方案


您可以尝试创建两个模块,一个包含主代码,另一个用于测试,然后尝试交叉构建第一个模块的两个不同版本。Sbt可以很容易地跨多个Scala版本进行交叉构建,但我不认为它可以在一个库的多个版本中实现这一点。

谢谢@dth,你让我走上了正确的道路。以下设置对我有效:

libraryDependencies ++= {
  Seq(
      javaJdbc,
      javaEbean,
      cache,
      javaWs,
      "org.webjars" %% "webjars-play" % "2.3.0-2",
      "org.webjars" % "bootstrap" % "3.3.6",
      "org.webjars" % "font-awesome" % "4.5.0",
      "be.objectify" %% "deadbolt-java" % "2.3.3",
      "org.apache.lucene" % "lucene-core" % "3.6.0" % "compile,test",
      "org.elasticsearch" % "elasticsearch" % "1.7.4" % "compile,runtime",
      "org.elasticsearch" % "elasticsearch" % "1.7.4"  % "test" exclude("org.apache.lucene", "lucene-core"),          
      "javax.jcr" % "jcr" % "2.0",
      "org.apache.jackrabbit" % "jackrabbit-core" % "2.11.2",
      "org.apache.jackrabbit" % "jackrabbit-jcr2dav" % "2.11.2",
      "org.apache.tika" % "tika-parsers" % "1.11",
      "org.apache.tika" % "tika-core" % "1.11",
      "commons-io" % "commons-io" % "2.4",
      "com.typesafe.akka" %  "akka-testkit_2.11" % "2.3.14" % "test"     
   )
}

谢谢@dth,你让我走上了正轨。以下设置对我有效:

libraryDependencies ++= {
  Seq(
      javaJdbc,
      javaEbean,
      cache,
      javaWs,
      "org.webjars" %% "webjars-play" % "2.3.0-2",
      "org.webjars" % "bootstrap" % "3.3.6",
      "org.webjars" % "font-awesome" % "4.5.0",
      "be.objectify" %% "deadbolt-java" % "2.3.3",
      "org.apache.lucene" % "lucene-core" % "3.6.0" % "compile,test",
      "org.elasticsearch" % "elasticsearch" % "1.7.4" % "compile,runtime",
      "org.elasticsearch" % "elasticsearch" % "1.7.4"  % "test" exclude("org.apache.lucene", "lucene-core"),          
      "javax.jcr" % "jcr" % "2.0",
      "org.apache.jackrabbit" % "jackrabbit-core" % "2.11.2",
      "org.apache.jackrabbit" % "jackrabbit-jcr2dav" % "2.11.2",
      "org.apache.tika" % "tika-parsers" % "1.11",
      "org.apache.tika" % "tika-core" % "1.11",
      "commons-io" % "commons-io" % "2.4",
      "com.typesafe.akka" %  "akka-testkit_2.11" % "2.3.14" % "test"     
   )
}