使用sbt程序集重命名文件
我有一个scala项目,它使用使用sbt程序集重命名文件,sbt,sbt-assembly,Sbt,Sbt Assembly,我有一个scala项目,它使用ConfigFactory设置应用程序配置。对于建筑,我使用sbt(与sbt组件一起使用) 根据是使用sbt assembly创建程序集,还是仅运行项目,我希望使用不同的配置文件(application.conf运行项目时,assembly.conf运行项目程序集时) 为此,我考虑使用assemblymergesegy:在组装jar时,我将丢弃application.conf,并重命名assembly.conf。我的想法是: assemblyMergeStrateg
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中的做法:
你有没有让它工作过?我想做同样的事情