【问题标题】:lein uberjar - No configuration setting found for key 'akka.version'lein uberjar - 找不到密钥“akka.version”的配置设置
【发布时间】: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.confakka.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 的“皮肤”。
  • 我可能需要仔细查看项目结构以进一步帮助您。绘制项目目录树容易吗?

标签: clojure akka leiningen


【解决方案1】:

从两个 jar 中手动合并 reference.conf,然后手动更改 uberjar(覆盖现有的 reference.conf)就可以了。合并后的文件为here

我相信只要有来自具有相同名称的不同 jar 的属性文件,就会出现此问题。例如log4j.properties 也需要被覆盖。

【讨论】:

    【解决方案2】:

    我更改了 spark 版本以避免此类问题。 Spark 2.1.0 不依赖 Akka,也不存在 Akka reference.conf 的问题。

    【讨论】:

      猜你喜欢
      • 2015-09-09
      • 2015-02-21
      • 2023-03-21
      • 2017-10-29
      • 2011-04-10
      • 2018-04-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多