使用sbt-assembly重命名文件

时间:2016-03-17 11:00:21

标签: sbt sbt-assembly

我有一个使用ConfigFactory设置应用程序配置的scala项目。对于构建,我使用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重命名为。我怎样才能做到这一点?

1 个答案:

答案 0 :(得分:1)

您需要定义自己的MergeStrategy(在project目录中),该文件将文件重命名为application.conf,然后重新定义assemblyMergeStrategy in assembly以丢弃原始application.conf并应用{{1 }}到MyMergeStrategy

assembly.conf

然后在build.sbt中使用:

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"))
  }
}

这仅适用于您的情况,但对于更复杂的情况,我将在sbt-native-packager中阅读它们的操作方式: https://www.scala-sbt.org/sbt-native-packager/recipes/package_configuration.html