Search code examples
scalaconfigurationtypesafetypesafe-config

scala- error loading a properties file packed inside jar


This is a newbie question, I read a lot but I am a bit confused.

I pass a properties file from inside a Jar, configuration is read, all is fine.

I wanted to add a try catch.I tried this but it does not work because the loading does not produce an exception if the properties file is not present. Therefore 3 questions:

  • Is it correct to load files like this?
  • Does it make sense to put a try/catch since the config is inside the jar?
  • If so, any suggestions on how to?

    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)
      }
    }
    

Solution

  • Your code looks ok in general.

    ConfigFactory.load("resource.config") will handle a missing resource like an empty resource. As a result you get an empty Config. So, a try-catch-block does not really make sense.

    You would usually specify a fallback configuration like this:

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

    EDIT:

    The sentence

    As a result you get an empty Config

    Is somewhat incomplete. ConfigFactory.load(resourceBaseName: String) applies defaultReference() and defaultOverrides(). So your resulting Config object probably contains some generic environment data and is not empty.

    As far as I can see, your best option to check if the resource is there and emit an error message if not, is to look up the resource yourself:

      val configFile = "application.properties"
      val config = Option(getClass.getClassLoader.getResource(configFile)).fold {
        println(s"Config not found!")
        ConfigFactory.load()
      } { resource =>
        ConfigFactory.load(configFile)
      }