scala - sbt 测试中的库依赖关系与正常模式下不同

标签 scala playframework sbt typesafe-activator typesafe

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

name := """example"""

version := "0.1"

lazy val root = (project in file(".")).enablePlugins(PlayJava)

scalaVersion := "2.11.1"

// fork in Test := true

javaOptions in Test += "-Dconfig.file=conf/application.test.conf"

javaOptions in Test += "-Dlogger.file=conf/test-logger.xml"

// run activator -Dtest
if (sys.props.contains("test")) {
  Seq[Project.Setting[_]](  
    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",
          "org.elasticsearch" % "elasticsearch" % "1.7.4" 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"
        )
    }
  )
} else {
  Seq[Project.Setting[_]](
   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.elasticsearch" % "elasticsearch" % "1.7.4",
          "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"     
       )
    }
  )
}


//.. our private nexus repo left out here

resolvers += "JBoss Repository" at "https://repository.jboss.org/nexus/content/repositories"

resolvers += "JBoss Third-Party Repository" at "https://repository.jboss.org/nexus/content/repositories/thirdparty-releases"

resolvers += "Typesafe repository" at "http://repo.typesafe.com/typesafe/releases/"

resolvers += Resolver.url("Objectify Play Repository", url("http://deadbolt.ws/releases/"))(Resolver.ivyStylePatterns)

最佳答案

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

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

"com.typesafe.akka" %  "akka-testkit_2.11" % "2.3.14" % "test"

但是您还应该能够使用“compile”和“runtime”来定义仅编译时和运行时的依赖项。

如果我使用不同版本的依赖项,sbt 会向我打印一条警告。问题是,这将使用不同版本的依赖项来编译它,然后通过测试运行它。因此它将针对与编译时不同的版本运行。当然,有一些库可以发挥作用,特别是如果您运行的版本比您用来编译的版本更新。

如果您确实需要使用不同的依赖项编译应用程序两次,并使用一个版本来运行,一个版本用于测试,我担心,如果不扩展 sbt 或类似的东西,就没有解决方案。

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

关于scala - sbt 测试中的库依赖关系与正常模式下不同,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35272727/

相关文章:

scala - 编写一个返回 => T 的函数

java - Play Framework : Pass date to view

scala - Play项目如何添加jdbc依赖?

scala - 如何将包导入 Scala REPL?

scala - 是否有针对非 Scala 程序员的 SBT 指南?

scala - SBT assembly-plugin 的 PathList 中的 "xs @ _*"是什么意思?

scala - Spark-SQL : How to read a TSV or CSV file into dataframe and apply a custom schema?

scala - akka 流 asyncBoundary 与 mapAsync

play框架项目中资源的java相对路径

json - Play 框架,JSON 读取组合器,具有覆盖的 apply 方法