Собственный упаковщик sbt: не удается найти ресурс при запуске исполняемого файла

Я работаю над приложением, которое использует sbt-native-packager с архетипом akka_application.

У меня есть структура каталогов, которая выглядит так:

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 скопировать все файлы в ресурсах в ClassPath созданного JAR-файла? Я прочитал и перечитал sbt-native- документации упаковщика, пытался добавить ресурс в Universal, и это все равно происходит каждый раз. Есть ли другой способ, которым я должен подходить к этому?


person Travis Kaufman    schedule 04.12.2014    source источник


Ответы (2)


Прежде всего, я рекомендую не использовать 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

Подробнее об этом можно прочитать на странице Добавление конфигурации. и Создание файлов.

#2 вручную с помощью вспомогательных методов

Простой способ для одного файла очень простой

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

Кроме того, у вас есть помощники для операций с каталогами. Дополнительные сведения см. в документах Mappingshelper.

person Muki    schedule 06.12.2014

Обновите то, что Муки написал выше для варианта № 2.

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

По умолчанию эта папка должна отображаться в /opt/docker/resources

person Alexey Novakov    schedule 11.10.2019