2017-05-29 46 views
0

我正在使用netty創建一個使用ClusterActorRefProvider的簡單akka羣集。當我從想法運行代碼時,一切正常。但是,當我將應用程序作爲jar運行時,突然間一切都失敗了。它會拋出一個錯誤「沒有找到配置設置的關鍵'akka.remote.artery'」。我正在使用sbt程序集創建jar。未找到配置設置的密鑰'akka.remote.artery'

我在這裏錯過了什麼?任何幫助,請....

+0

請讓我知道如果你需要更多的細節... – ArunavaS

+0

似乎application.conf文件不存在於你的jar中。你能列出jar內容嗎?你可以使用'jar tf your.jar'。 –

+0

看起來像你正在使用akka遠程(與動脈)=> http://doc.akka.io/docs/akka/current/scala/remoting-artery.html – mfirry

回答

2

在build.sbt使用以下行解決

assemblyMergeStrategy in assembly := { 
    case PathList("META-INF", xs @ _*) => MergeStrategy.discard 
    case "reference.conf" => MergeStrategy.concat 
    case x => MergeStrategy.first 
} 
0

與所有的依賴包裝當阿卡應用程序作爲遠JAR合併在一起,用我遇到了類似的問題Maven程序集插件而不是SBT。

問題的根源在於,打包胖JAR時,默認情況下,構建系統會覆蓋駐留在相同路徑中的文件(例如/reference.conf)。因此,當使用多個Akka模塊時,一個reference.conf將最終覆蓋其他所有其他模塊,因此您最終將在您的JAR文件中獲得單個部分reference.conf,而不是多個reference.conf,然後在加載它們時由配置庫合併。

這會導致找不到配置錯誤,因爲某些模塊的默認配置設置(如reference.conf中覆蓋的那樣)缺失。

@ArunavaS答案適用於SBT,因爲它合併reference.conf文件。如果使用Maven,則可以將其配置爲執行類似操作(例如,參見How can I merge resource files in a Maven assembly?)。

或者,也可以不使用胖JAR,而是將所有依賴項導出到單獨的文件夾,然後在運行JAR文件時將它們添加到類路徑中。