Creating a fat can Akka

I need to create a Nutch plugin that communicates with some external applications using Akka. To do this, I need to pack the plugin in the form of fat Jar - I use sbt-assembly version 0.8.3.

When I try to run the plugin, I get an exception

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

as if Akka could not find reference.conf . This is strange, because sbt-assembly should be able to properly package this file, and in fact I can see its contents in the created jar.

My build.sbt as follows:

 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) } } 

The last lines are needed to fix some conflicts between nutch and hadoop.

What is the correct way to pack an Akka application?

+4
source share
1 answer

The latest version of sbt-assembly as of November 2013 is 0.10.1 for sbt 0.13. Using this, I was able to create a fat jar using the latest stable Akka 2.2.3, using the default merge strategy.

Files

project / build.properties:

 sbt.version=0.13.0 

Project / assembly.sbt:

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

assembly.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 / Primary / 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") } } 

Src / main / scala / app.scala:

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

Output

Here is what I got by running 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 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 

And here is what it is like running 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 
+3
source

All Articles