【发布时间】:2016-06-18 08:08:44
【问题描述】:
我可以创建一个由许多类文件组成的 uberjar,最初是 Scala、Java、Clojure。我遇到的问题是,当我运行 java -jar my-server.jar 时,它会崩溃:
No configuration setting found for key 'akka.version'
这是意料之中的,有一个maven solution。接受的答案here 上的黄色文字基本上是 Akka 说“你不应该在其中构建带有 Akka jar 的 uberjar,因为那样 Akka 将无法找到它的 .conf 文件。”
我正在尝试将此作为 lein 解决方案:
:pom-plugins [[org.apache.maven.plugins/maven-shade-plugin 2.2]]
我有一个本地 maven 存储库(我的意思不是 ~/.m2 存储库,而是用于将非 Clojars jar 引入 lein 构建的本地存储库)。也许我需要 lein deploy localrepo1 再次获取 akka 罐子以获取这个新设置 - 不 - 这没有帮助。
这里有一些堆栈跟踪,以明确问题出在哪里:
Exception in thread "main" com.typesafe.config.ConfigException$Missing: No configuration setting found for key 'akka.version'
at com.typesafe.config.impl.SimpleConfig.findKey(SimpleConfig.java:124)
at com.typesafe.config.impl.SimpleConfig.find(SimpleConfig.java:145)
at com.typesafe.config.impl.SimpleConfig.find(SimpleConfig.java:151)
at com.typesafe.config.impl.SimpleConfig.find(SimpleConfig.java:159)
at com.typesafe.config.impl.SimpleConfig.find(SimpleConfig.java:164)
at com.typesafe.config.impl.SimpleConfig.getString(SimpleConfig.java:206)
at akka.actor.ActorSystem$Settings.<init>(ActorSystem.scala:169)
at akka.actor.ActorSystemImpl.<init>(ActorSystem.scala:505)
at akka.actor.ActorSystem$.apply(ActorSystem.scala:142)
at akka.actor.ActorSystem$.apply(ActorSystem.scala:109)
at com.seasoft.comms.MyPLCActorHolder.createRefToLocalActor(MyPLCActorHolder.scala:39)
编辑 我现在查看了 jar 文件的内部。有两个 akka jar 文件,其中都有一个 reference.conf。这些文件没有正确合并,因为(不出所料)lein uberjar 不理解其中的属性键/值的嵌套。
特别是akka-actor_2.11-2.3.9.jar 中的reference.conf 有akka.version = "2.3.9",但此条目尚未进入合并的reference.conf。我改变了 uberjar 并解决了问题,当然给了我下一个合并问题。所以这里的解决方法是自己手动进行合并。
更好的解决方法是编写一个小合并程序(具有两个功能:谓词和合并)并将其放入 akka,以便编写构建工具的人可以使用它...
【问题讨论】:
-
您的
project.clj是否包含akka.version密钥? -
我明白你在说什么。我不认为这是必需的 lein
key。该消息基本上是 Akka 说它看不到它自己的配置文件,其中包含版本。如果我改用lein jar,显然一切都会好起来的。但我对这种方法还有其他问题。 -
我是一名 Scala 开发人员,我可以告诉你,你发布的错误来自于使用一个名为 Typesafe Config (github.com/typesafehub/config) 的通用库来获取 Scala 的属性。您应该在包含该键的类路径中有
.conf文件。 -
我是新来的 uberjars。所有配置文件都放在 uberjar 的顶层。有一个reference.conf,其中有各种Akka 设置,但其中没有
version字符串。顺便说一句,这是工作代码,我只是给它一个 Clojure 的“皮肤”。 -
我可能需要仔细查看项目结构以进一步帮助您。绘制项目目录树容易吗?