使用sbt程序集重命名文件

使用sbt程序集重命名文件,sbt,sbt-assembly,Sbt,Sbt Assembly,我有一个scala项目,它使用ConfigFactory设置应用程序配置。对于建筑,我使用sbt(与sbt组件一起使用) 根据是使用sbt assembly创建程序集,还是仅运行项目,我希望使用不同的配置文件(application.conf运行项目时,assembly.conf运行项目程序集时) 为此,我考虑使用assemblymergesegy:在组装jar时,我将丢弃application.conf,并重命名assembly.conf。我的想法是: assemblyMergeStrateg

我有一个scala项目,它使用
ConfigFactory
设置应用程序配置。对于建筑,我使用
sbt
(与
sbt组件一起使用)

根据是使用
sbt assembly
创建程序集,还是仅运行项目,我希望使用不同的配置文件(
application.conf
运行项目时,
assembly.conf
运行项目程序集时)

为此,我考虑使用
assemblymergesegy
:在组装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
。如何实现这一点?

您需要定义自己的合并策略(在
project
目录中)这将把文件重命名为
application.conf
,然后在assembly
中重新定义
assemblyMergeStrategy以丢弃原始
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中的做法:

你有没有让它工作过?我想做同样的事情