How to get load file under resources folder in scala sbt - scala

I am having a akka actors config file under resources,
src/main/resources/remote_app.conf
src/main/scala/actors/Notification.scala
I am loading the resources as below,
1.
val configFile = getClass.getClassLoader.getResource("remote_app.conf").getFile
val config_mediation = ConfigFactory.parseFile(new File(configFile))
actorSystem = ActorSystem("MediationActorSystem", config_mediation)
2.
val path = getClass.getResource("/remote_app.conf").getFile
val config_mediation = ConfigFactory.parseFile(new File(path))
actorSystem = ActorSystem("MediationActorSystem", config_mediation)
Both works fine when i execute from main program and getting the below logs,
[INFO] [11/21/2016 21:05:02.835] [main] [Remoting] Remoting started;
listening on addresses
:[akka.tcp://MediationActorSystem#127.0.0.1:7070] [INFO] [11/21/2016
21:05:02.838] [main] [Remoting] Remoting now listens on addresses:
[akka.tcp://MediationActorSystem#127.0.0.1:7070]
I am creating a jar using sbt test:assembly and executing the main class as below
SBT:
resourceDirectory in Compile := baseDirectory.value /"src/main/resources"
resourceDirectory in Test := baseDirectory.value /"src/main/resources"
java -cp <jar> <args>
Its not able to load the config file when i execute from jar.
Anything am i doing wrong.

The easiest way might be to use something like lightbend conf -library:
https://github.com/lightbend/config
It will by default pick the application.conf file from -resources folder.
import com.typesafe.config.ConfigFactory
val conf = ConfigFactory.load()
You can also give the load -function other file names as parameter:
val conf = ConfigFactory.load("someother.conf")
Note: no slash before filename.

Answer from pamu is a nice hint but did not fully work for me. You still have to convert it to an InputStream.
The full solution would be:
val is = getClass.getClassLoader.getResourceAsStream("remote_app.conf")
val source = scala.io.Source.fromInputStream(is).mkString
val config = ConfigFactory.parseString(source)

This is the popular program encountered by lot of people. Use getResourceAsStream This works normally and when used inside jar.
getClass.getResourceAsStream("/remote_app.conf")

Related

read a scala conf file from a maven jar

I would like to read two scala conf file from a maven jar named myconfiguration1.conf and myconfiguration2.conf:
driver= oracle.jdbc.driver.OracleDriver
user = myUser
password = pass
url = myUrl
table = my_table
before generate my jar, i used a line like this:
val myconfig1 = ConfigFactory.parseFile(new File("./my-project/src/main/resources/myconfiguration1.conf"))
val myconfig2 = ConfigFactory.parseFile(new File("./my-project/src/main/resources/myconfiguration2.conf"))
Inside my jar, i have a tree like this
my-project-0.0.1.jar
|___ myconfiguration1.conf
|___ myconfiguration2.conf
Do you have any idea since the two lines don't work with the jar file.
Seems you are using typesafe config to load the conf file, you can directly use ConfigFactory.load("myconfiguration1.conf") and ConfigFactory.load("myconfiguration2.conf") to load the classpath configuration file.
public static load(java.lang.String resourceBasename)

Pick the right config file

I have created two files in my src/main/resources folder
application-dev.conf
which contains
dev {
oracle {
host = "foo"
}
}
and
application-qa.conf
which contains
qa {
oracle {
host = "bar"
}
}
I read this configuration with the following code
val env = args.lift(0).getOrElse("dev")
val parsedConfig = ConfigFactory.parseFile(new File(s"src/main/resources/application-${env}.conf"))
val conf = ConfigFactory.load(parsedConfig)
val config = conf.getConfig(env)
println(config.getString("oracle.host"))
Everything works great at development time and I am able to read the right configuration file based on the environment specified. If I don't specify anything then development is chosen.
However now when I package my jar file as an assembly using sbt assembly and now try to run my application from the command line java -jar ./target/MyApplication.jar
I get an error
Exception in thread "main" com.typesafe.config.ConfigException$Missing: No configuration setting found for key 'dev'
at com.typesafe.config.impl.SimpleConfig.findKeyOrNull(SimpleConfig.java:152)
at com.typesafe.config.impl.SimpleConfig.findOrNull(SimpleConfig.java:170)
at com.typesafe.config.impl.SimpleConfig.find(SimpleConfig.java:184)
at com.typesafe.config.impl.SimpleConfig.find(SimpleConfig.java:189)
My objective is that I should have multiple configuration files and I should be able to choose between them at dev time and also when the application is packaged as a jar.
Based on the suggestion below I modified my code to
val env = args.lift(0).getOrElse("dev")
val parsedConfig = ConfigFactory.parseFile(new File(getClass.getResource(s"/application-${env}.conf").toURI))
val conf = ConfigFactory.load(parsedConfig)
val config = conf.getConfig(env)
println(config.getString("oracle.host"))
works in dev, but when I try to run my assembly it throws an exception
Exception in thread "main" java.lang.IllegalArgumentException: URI is not hierarchical
at java.io.File.<init>(File.java:418)
The config file is not in src/main/resources in your assembly. It usually is at the root of the classpath (unless you have configured the plugin to package it somewhere else).
Try using like below.
ConfigFactory.load(s"application-${env}.conf")
This loads the config file from the classpath.

Load application.conf from folder in deployed Scala app

I have an application that loads configuration from application.conf using ConfigFactory: lazy val myConfig = ConfigFactory.load(pathToConfig)
The application.conf is initially located in src/main/resources
When I deploy my application I want it to load the config from APP_HOME/conf/application.conf
To do so, I excluded the application.conf from the resource folder when building the Rmp and I have added my APP_HOME/conf to the class path.
jar {
exclude '*.conf'
}
and
startScripts {
classpath += files('src/main/resources')
doLast {
def windowsScriptFile = file getWindowsScript()
def unixScriptFile = file getUnixScript()
println('unix script is ' + unixScriptFile.text)
windowsScriptFile.text = windowsScriptFile.text.replace('%APP_HOME%\\lib\\resources', '%APP_HOME%\\conf')
unixScriptFile.text = unixScriptFile.text.replace('\$APP_HOME/lib/resources', '\$APP_HOME/conf')
println('after unix script is ' + unixScriptFile.text)
}
}
The odd thing is that when I modify the $APP_HOME/conf/application.conf and restart the app, the changes are not picked up: ie the old configuration is still being used
Any idea what might cause this or how I can print where the config is being loaded from would be helpful
With many attempts, I got it to work by calling lazy val myConfig = ConfigFactory.load() without specifying the conf file name or path.
Although it solved my issue I still don't understand why calling load with the file name or file path didn't work

how to get values from addition conf files included in application.conf in scala

Hi I am trying to create additional conf files and include them in application.conf but i am unable to fetch my values I am definitely making mistakes here is my files
application.conf
include "DirectUserWriteMongoActor"
akka {
loggers = ["akka.event.slf4j.Slf4jLogger"]
loglevel = "DEBUG"
}
DirectUserWriteMongoActor.conf
akka {
actor{
my-dispatcher {
throughput = 10
}
}
}
i want to get the throughput value in my code but i am getting badpath exception Here is my code
val config = ConfigFactory.load("application/DirectUserWriteMongoActor")
println("throughput is "+config.getString("akka.actor.my-dispatcher.throughput"))
All you should need to do here is to call ConfigFactory.load(). When you do that, as long as it can find application.conf on the classpath, it will load it and then properly include the other conf file DirectUserWriteMongoActor due to your use of the include directive.

application.conf for Scala SBT Akka Actors

I was wondering.. where do you put the application.conf file that configures actors in a file? I'm trying to do what is being done here but SBT is not picking up on the file - I was under the impression that SBT will find the application.conf and automatically add it to my -classpath. I currently have application.conf in /project/application.conf
The error I'm getting is:
[ERROR] [04/11/2012 16:08:13.174] [HittingTimeSystem-akka.actor.default-dispatcher-2] [akka://HittingTimeSystem/user/master] error while creating actor
akka.config.ConfigurationException:router Actor[akka://HittingTimeSystem/user/master/workerRouter] needs external configuration from file (e.g. application.conf)
Thanks!
-kstruct
It should end up on the classpath if you put it in src/main/resources/application.conf
just update:
// val conffactory = ConfigFactory.load() // from 'src/test/resources' if 'sbt test'
// val conffactory = ConfigFactory.load() // from 'src/main/resources' if 'sbt run'
val conf = ConfigFactory.parseFile(new File("config/application.conf")).getConfig("my") // from '/config' where / - root of app