【发布时间】:2013-02-18 15:11:24
【问题描述】:
我需要创建一个使用 Akka 与一些外部应用程序通信的 Nutch 插件。为此,我需要将插件打包为胖 Jar - 我使用的是 sbt-assembly 版本 0.8.3。
当我尝试运行插件时,我得到了异常
com.typesafe.config.ConfigException$Missing: No configuration setting found for key 'akka'
好像 Akka 找不到 reference.conf。这很奇怪,因为sbt-assemblyshould be able可以正确打包那个文件,实际上我可以在创建的jar中看到它的内容。
我的build.sbt 看起来像这样:
import AssemblyKeys._
name := "my-project"
version := "0.1-SNAPSHOT"
scalaVersion := "2.10.0"
resolvers ++= Seq(
"Central Repo" at "http://repo1.maven.org/maven2",
"Typesafe Repository" at "http://repo.typesafe.com/typesafe/releases/",
"Akka io" at "http://akka.io/repository"
)
libraryDependencies ++= Seq(
...,
"com.typesafe.akka" %% "akka-actor" % "2.1.1",
"com.typesafe.akka" %% "akka-remote" % "2.1.1"
)
seq(assemblySettings: _*)
mergeStrategy in assembly <<= (mergeStrategy in assembly) { (old) =>
{
case "plugin.xml" =>
MergeStrategy.first
case x if x startsWith "org/apache/jasper" =>
MergeStrategy.last
case x if x startsWith "javax/xml" =>
MergeStrategy.last
case x if x startsWith "javax/servlet" =>
MergeStrategy.last
case x if x startsWith "org/apache/commons" =>
MergeStrategy.last
case x if x startsWith "org/apache/xmlcommons" =>
MergeStrategy.last
case x if x startsWith "org/xml/sax" =>
MergeStrategy.last
case x if x startsWith "org/w3c/dom" =>
MergeStrategy.last
case x => old(x)
}
}
需要最后几行来解决 nutch 和 hadoop 之间的一些冲突。
打包 Akka 应用程序的正确方法是什么?
【问题讨论】:
-
akka 文档有一个关于汇编的警告:doc.akka.io/docs/akka/snapshot/general/configuration.html 搜索
When using JarJar, OneJar, Assembly or any jar-bundler。我不确定它是否对您的情况有帮助 -
是的,我在问题中包含的链接指向
Let it crash!博客中讨论此问题的条目。理论上sbt-assembly' should merge thereference.conf`文件的默认配置——实际上我可以在jar中看到合并的结果。但是好像不管我用什么合并策略,关键akka都不见了,也就是根本没有读取文件reference.conf。 -
它是否还包括位于
akka-actorjar 中的reference.conf的内容? -
是的。它实际上包含一个文件,其内容是
akka-actor中的reference.conf和akka-remote中的一个连接。 -
这将有助于显示或检查实际的堆栈跟踪,因为精确的错误消息与“常见”问题不匹配(因为缺少
akka.version;在您的情况下它只是 @987654339 @)
标签: scala sbt akka nutch sbt-assembly