首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用sbt-assembly重命名文件

使用sbt-assembly重命名文件
EN

Stack Overflow用户
提问于 2016-03-17 19:00:21
回答 1查看 932关注 0票数 3

我有一个scala项目,它使用ConfigFactory来设置应用程序配置。对于构建,我使用sbt (与sbt-assembly一起)。

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

为此,我考虑使用assemblyMergeStrategy:在组装jar时,我将丢弃application.conf并重命名为assembly.conf。我的想法是这样的:

代码语言:javascript
复制
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应该重命名为什么文件名。我如何才能做到这一点?

EN

回答 1

Stack Overflow用户

发布于 2019-01-13 23:49:03

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

代码语言:javascript
复制
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中使用:

代码语言:javascript
复制
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

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36058600

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档