由于冲突/传递(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/