2

我在资源下有一个 akka 演员配置文件,

src/main/resources/remote_app.conf
src/main/scala/actors/Notification.scala

我正在加载如下资源,

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)

当我从主程序执行并获取以下日志时,两者都可以正常工作,

[INFO] [11/21/2016 21:05:02.835] [main] [Remoting] 远程开始;监听地址:[akka.tcp://MediationActorSystem@127.0.0.1:7070] [INFO] [11/21/2016 21:05:02.838] [main] [Remoting] 远程现在监听地址:[akka.tcp ://MediationActorSystem@127.0.0.1:7070]

我正在使用 sbt test:assembly 创建一个 jar 并执行如下 SBT 的主类:

resourceDirectory in Compile := baseDirectory.value /"src/main/resources"
resourceDirectory in Test := baseDirectory.value /"src/main/resources"

java -cp <jar> <args>

当我从 jar 执行时,它无法加载配置文件。我做错了什么。

4

3 回答 3

1

这是很多人遇到的流行程序。使用getResourceAsStream这可以正常工作,并且在罐子内使用时。

getClass.getResourceAsStream("/remote_app.conf")
于 2016-11-21T16:02:58.417 回答
1

最简单的方法可能是使用 lightbend conf -library 之类的东西: https ://github.com/lightbend/config

默认情况下,它将从 -resources 文件夹中选择 application.conf 文件。

import com.typesafe.config.ConfigFactory
val conf = ConfigFactory.load()

您还可以为 load -function 提供其他文件名作为参数:

val conf = ConfigFactory.load("someother.conf")

注意:文件名前没有斜杠。

于 2018-05-08T09:19:43.010 回答
1

pamu 的回答是一个很好的提示,但对我来说并不完全有效。您仍然需要将其转换为InputStream. 完整的解决方案是:

val is = getClass.getClassLoader.getResourceAsStream("remote_app.conf")
val source = scala.io.Source.fromInputStream(is).mkString
val config = ConfigFactory.parseString(source)
于 2018-05-08T08:03:08.773 回答