sbt native packager:在运行可执行文件时找不到资源

时间:2014-12-04 00:22:43

标签: scala sbt sbt-native-packager

我正在开发一个使用带有akka_application原型的sbt-native-packager的应用程序。

我的目录结构如下:

src/
  main/
    resources/
      application.conf
      somePrivateKey.p12

在我的代码中,我有一个方法将文件句柄返回到p12文件

def getSomePrivateKey: java.io.File = {
  val cl = this.getClass.getClassLoader
  val fileUrl = cl.getResource("somePrivateKey.p12")
  new java.io.File(fileUrl.getFile())
}

当我通过sbt console从命令行使用它时,它完美无缺。我可以像预期的那样轻松使用该文件。

但是,当我运行sbt stage然后运行它创建的可执行文件时,我在尝试打开文件时得到FileNotFoundException

如何告诉sbt-native-packager将资源中的所有文件复制到创建的JAR的ClassPath上?我已阅读并重新阅读了sbt -native-packager文档,尝试将资源添加到Universal,并且每次都会发生。还有另一种方法我应该接近这个吗?

2 个答案:

答案 0 :(得分:1)

首先,我建议不要使用getClassLoader来加载资源。请务必使用亲戚路径,例如baseDirectory.value / "src" / "main" / "resources"或更好"resourceDirectory.value / "your-resources"

对于 sbt-native-packager ,有几种方法可以包含文件。

#1默认文件夹

只需将somePrivateKey.p12放入以下文件夹

即可
  • src/universal/conf/适用于所有发行版(zip,deb,msi等)
  • src/linux/conf/仅适用于Linux发行版
  • src/windows/conf/仅适用于Windows发行版

您可以在Adding ConfigurationGenerating Files更详细地了解这一点。

#2手动辅助方法

一个文件的简单方法是非常基本的

mappings in Universal += resourceDirectory.value / "somePrivateKey.p12"

此外,您还有目录操作的帮助程序。 有关详细信息,请参阅Mappingshelper Docs

答案 1 :(得分:0)

更新为Muki上面为选项#2写的内容

mappings in Universal ++= directory("src/main/resources")

默认情况下,此文件夹应显示在/opt/docker/resources