Создание жирной банки Akka

Мне нужно создать плагин Nutch, который взаимодействует с некоторыми внешними приложениями с помощью Akka. Для этого мне нужно упаковать плагин как толстый Jar — я использую sbt-assembly< /а> версия 0.8.3.

Когда я пытаюсь запустить плагин, я получаю исключение

com.typesafe.config.ConfigException$Missing: No configuration setting found for key 'akka'

как будто Акка не смогла найти reference.conf. Это странно, потому что sbt-assembly должна быть возможность правильно упаковать этот файл, и на самом деле я могу видеть его содержимое в созданном банке.

Мой 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?


person Andrea    schedule 04.03.2013    source источник
comment
В документации akka есть предупреждение о сборке: doc.akka.io/docs /akka/snapshot/general/configuration.html Найдите When using JarJar, OneJar, Assembly or any jar-bundler. Я не уверен, что это поможет вашему делу   -  person EECOLOR    schedule 04.03.2013
comment
Да, ссылка, которую я включил в свой вопрос, указывает на запись в блоге Let it crash!, где обсуждается этот вопрос. Теоретически дефолтная конфигурация файлов sbt-assembly' should merge the reference.conf` - по факту я вижу результат слияния в jar. Но похоже, какую бы стратегию слияния я ни использовал, ключ akka отсутствует, то есть файл reference.conf вообще не читается.   -  person Andrea    schedule 04.03.2013
comment
Включает ли он также содержимое reference.conf, которое находится в банке akka-actor?   -  person EECOLOR    schedule 04.03.2013
comment
Да. На самом деле он включает файл, содержимое которого представляет собой конкатенацию reference.conf в akka-actor и akka-remote.   -  person Andrea    schedule 04.03.2013
comment
было бы полезно показать или проверить фактическую трассировку стека, поскольку точное сообщение об ошибке не соответствует «обычной» проблеме (в этом akka.version отсутствует; в вашем случае это только akka)   -  person Roland Kuhn    schedule 06.03.2013


Ответы (1)


Последняя версия sbt-assembly по состоянию на ноябрь 2013 года: 0.10.1 для sbt 0.13. Используя это, я смог создать толстую банку, используя последнюю стабильную версию Akka 2.2.3, используя стратегию слияния по умолчанию.

Файлы

проект/сборка.свойства:

sbt.version=0.13.0

проект/сборка.sbt:

addSbtPlugin("com.eed3si9n" % "sbt-assembly" % "0.10.1")

сборка.sbt:

import AssemblyKeys._

assemblySettings

build.sbt:

name := "sbt-assembly-akka-sample"

version := "0.1.0-SNAPSHOT"

scalaVersion := "2.10.3"

libraryDependencies ++= Seq(
  "com.typesafe.akka" %% "akka-actor" % "2.2.3",
  "com.typesafe.akka" %% "akka-remote" % "2.2.3"
)

src/main/scala/actor.scala:

package hello

import akka.actor.{Actor, Props}
import akka.event.Logging

class MyActor extends Actor {
  val log = Logging(context.system, this)
  def receive = {
    case "test" ⇒ log.info("received test")
    case _      ⇒ log.info("received unknown message")
  }
}

источник/основной/скала/приложение.скала:

package hello

object Main extends App {
  import akka.actor.{ActorSystem, Props}
  val system = ActorSystem("mySystem")
  val myActor = system.actorOf(Props[MyActor], "myactor")
  myActor ! "test"
}

Выход

Вот что я получил, запустив assembly:

> assembly
[info] Updating {file:/xxx/sbt-assembly-01/}sbt-assembly-01...
[info] Resolving org.fusesource.jansi#jansi;1.4 ...
[info] Done updating.
[info] Compiling 2 Scala sources to /xxx/sbt-assembly-01/target/scala-2.10/classes...
[info] Including: uncommons-maths-1.2.2a.jar
[info] Including: protobuf-java-2.4.1.jar
[info] Including: config-1.0.2.jar
[info] Including: netty-3.6.6.Final.jar
[info] Including: akka-remote_2.10-2.2.3.jar
[info] Including: akka-actor_2.10-2.2.3.jar
[info] Passed: Total 0, Failed 0, Errors 0, Passed 0
[info] No tests to run for test:test
[info] Including: scala-library-2.10.3.jar
[info] Checking every *.class/*.jar file's SHA-1.
[info] Merging files...
[warn] Merging 'META-INF/NOTICE.txt' with strategy 'rename'
[warn] Merging 'META-INF/license' with strategy 'rename'
[warn] Merging 'META-INF/LICENSE.txt' with strategy 'rename'
[warn] Merging 'META-INF/MANIFEST.MF' with strategy 'discard'
[warn] Merging 'reference.conf' with strategy 'concat'
[warn] Strategy 'concat' was applied to a file
[warn] Strategy 'discard' was applied to a file
[warn] Strategy 'rename' was applied to 3 files
[info] SHA-1: 1e9dcebeddc8e2a7d41a0c55a663f9ca0000000
[info] Packaging /xxx/sbt-assembly-01/target/scala-2.10/sbt-assembly-akka-sample-assembly-0.1.0-SNAPSHOT.jar ...
[info] Done packaging.
[success] Total time: 13 s, completed Nov 11, 2013 8:57:18 PM

А вот как это выглядит при запуске jar:

$ java -jar target/scala-2.10/sbt-assembly-akka-sample-assembly-0.1.0-SNAPSHOT.jar
[INFO] [11/11/2013 20:59:48.265] [mySystem-akka.actor.default-dispatcher-2] [akka://mySystem/user/myactor] received test
person Eugene Yokota    schedule 12.11.2013
comment
В первой строке конфигурации есть опечатка; это должно быть sbt.version. - person Glenn; 10.04.2014