我有一个scala项目,它使用ConfigFactory来设置应用程序配置。对于构建,我使用sbt (与sbt-assembly一起)。
根据是使用sbt-assembly创建程序集还是仅运行项目,我希望使用不同的配置文件(运行项目时使用application.conf,运行项目程序集时使用assembly.conf )。
为此,我考虑使用assemblyMergeStrategy:在组装jar时,我将丢弃application.conf并重命名为assembly.conf。我的想法是这样的:
assemblyMergeStrategy in assembly := {
case PathList("application.conf") => MergeStrategy.discard
case PathList("assembly.conf") => MergeStrategy.rename
...
}通过这种方式,我想实现的是,在组装jar时,文件assembly.conf被重命名为application.conf,因此由ConfigFactory使用,而原始的application.conf被丢弃。
上面的代码显然不起作用,因为我不能指定assembly.conf应该重命名为什么文件名。我如何才能做到这一点?
发布于 2019-01-13 23:49:03
您需要定义自己的MergeStrategy(在project目录中),将文件重命名为application.conf,然后重新定义assemblyMergeStrategy in assembly以丢弃原始application.conf并将MyMergeStrategy应用于assembly.conf
import java.io.File
import sbtassembly.MergeStrategy
class MyMergeStrategy extends MergeStrategy{
override def name: String = "Rename to application.conf"
override def apply(tempDir: File, path: String, files: Seq[File]): Either[String, Seq[(File, String)]] = {
Right(files.map(_ -> "application.conf"))
}
}然后在build.sbt中使用:
val root = (project in file(".")).settings(Seq(
assemblyMergeStrategy in assembly := {
case PathList("application.conf") => MergeStrategy.discard
case PathList("assembly.conf") => new MyMergeStrategy()
case x =>
val oldStrategy = (assemblyMergeStrategy in assembly).value
oldStrategy(x)
}
))这只适用于您的情况,但对于更复杂的情况,我将阅读他们如何在sbt-native-packager中做到这一点:https://www.scala-sbt.org/sbt-native-packager/recipes/package_configuration.html
https://stackoverflow.com/questions/36058600
复制相似问题