scala - ошибка при загрузке файла свойств, упакованного внутри jar

Это вопрос новичка, я много читал, но немного запутался.

Я передаю файл свойств из Jar, конфигурация читается, все в порядке.

Я хотел добавить попытку поймать. Я попробовал это, но это не работает, потому что загрузка не создает исключения, если файл свойств отсутствует. Поэтому 3 вопроса:

  • Правильно ли загружать такие файлы?
  • Есть ли смысл ставить try/catch, раз конфиг внутри jar?
  • Если да, какие предложения о том, как?

    var appProps : Config = ConfigFactory.load()
    try { 
      appProps = ConfigFactory.load("application.properties") 
    } catch {
      case e: Exception => {
        log.error("application.properties file not found")
        sc.stop()
        System.exit(1)
      }
    }
    

person Irene    schedule 14.09.2015    source источник


Ответы (1)


Ваш код выглядит нормально в целом.

ConfigFactory.load("resource.config") будет обрабатывать отсутствующий ресурс как пустой ресурс. В результате вы получите пустой файл Config. Таким образом, блок try-catch на самом деле не имеет смысла.

Обычно вы указываете резервную конфигурацию следующим образом:

val appProps = ConfigFactory.load(
  "application.properties"
).withFallBack(
   ConfigFactory.load()
)

ИЗМЕНИТЬ:

Приговор

В результате вы получите пустой Config

Является несколько неполным. ConfigFactory.load(resourceBaseName: String) применяет defaultReference() и defaultOverrides(). Таким образом, ваш результирующий объект Config, вероятно, содержит некоторые общие данные среды и не является пустым.

Насколько я вижу, лучший способ проверить, есть ли ресурс, и выдать сообщение об ошибке, если нет, — это самостоятельно найти ресурс:

  val configFile = "application.properties"
  val config = Option(getClass.getClassLoader.getResource(configFile)).fold {
    println(s"Config not found!")
    ConfigFactory.load()
  } { resource =>
    ConfigFactory.load(configFile)
  }
person Sascha Kolberg    schedule 14.09.2015
comment
Спасибо за ваш ответ. Только вопрос: вот так, если application.properties не будет найден, будет загружен пустой конфиг, это правильно? Если да, то как я могу проверить, так ли это, и зарегистрировать это? Потому что я пробовал if(appProps.isEmpty), но это не работает - person Irene; 15.09.2015
comment
@Irene, я обновил свой ответ. Примечание. Нет необходимости начинать файл ресурсов с «/», поэтому я удалил это из ответа. - person Sascha Kolberg; 15.09.2015