scala - 将生成的资源包含在 jar (SBT) 中

标签 scala jar sbt

我一直在写一个 SBT 插件,它可以将资源生成到 resource_managed .我现在希望将这些生成的资源作为 SBT 文档详细信息包含在生成的 jar 中:

Generating resources :

By default, generated resources are not included in the packaged source artifact. To do so, add them as you would other mappings. See Adding files to a package



我已经阅读了文档,但老实说我不知道​​如何做到这一点。任何人都可以解释它或将我指向另一个这样做的项目,以便我可以看到他们是如何做到的?

最佳答案

首先澄清一下,它们包含在包含已编译类的 jar 中。它们不包含在包含源的 jar 中。

By default, generated resources are not included in the packaged source artifact.



对于 packageBin生成的文件应该已经包含在内——只需确保从生成器方法返回所有生成的文件。假设您想将它们打包在源工件中,这就是您必须做的。

假设您有一个生成属性文件的生成器。
lazy val generatePropertiesTask = Def.task {
  val file = (resourceManaged in Compile).value / "stack-overflow" / "res.properties"
  val contents = s"name=${name.value}\nversion=${version.value}"
  IO.write(file, contents)
  Seq(file)
}

resourceGenerators in Compile += generatePropertiesTask.taskValue

要将其包含在生成的源中,您必须告诉 sbt res.properties 的位置。必须在生成的源工件中复制。生成打包源的任务称为 packageSrc ,因此您必须设置映射 scoped to that task .
mappings in (Compile, packageSrc) += {
   ((resourceManaged in Compile).value / "stack-overflow" / "res.properties") -> "path/in/jar/res.properties"
}

因为你的生成器可以生成很多任务,手工映射每个任务会很乏味,所以 sbt 会给你一个 utility一次映射多个路径。
mappings in (Compile, packageSrc) ++= {
  val allGeneratedFiles = ((resourceManaged in Compile).value ** "*") filter { _.isFile }
  allGeneratedFiles.get pair relativeTo((resourceManaged in Compile).value)
}

第一行使用 path finders 查找所有生成的文件第二行将它们映射到目标 jar 中的路径。

关于scala - 将生成的资源包含在 jar (SBT) 中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25310052/

相关文章:

Scala 构造函数

java - 使用 org.keycloak.authentication.authenticators.broker.util 中的类时,提供程序 jar 中出现 NoClassDefFoundError

scala - sbt 自动插件 - 禁用它们,但只针对一个子项目

scala - 如何在使用 2.10.1 构建的项目中使用使用 2.9.2 构建的库?

java - 通过代码动态在eclipse中创建一个JAR文件

java - 如何正确加载本地库进行 sbt 测试?

scala - 创建在构造函数中隐含的akka​​ actor

scala - 如何在 Scala 中更改继承方法的访问级别

scala - 修改 Scala 映射值

java - 如何在java中从jar文件创建.exe?