Skip to content

Commit 5f9fea8

Browse files
committed
Merge pull request #363 from c4po/wip/akka
archetype for Akka microKernel application #316
2 parents b43d10c + 0b35164 commit 5f9fea8

File tree

10 files changed

+124
-9
lines changed

10 files changed

+124
-9
lines changed
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
#!/usr/bin/env bash
2+
3+
declare AKKA_HOME="$(cd "$(cd "$(dirname "$0")"; pwd -P)"/..; pwd)"
4+
declare -r app_home="$0"
5+
declare -r lib_dir="${AKKA_HOME}/lib"
6+
7+
${{template_declares}}
8+
9+
[ -n "$JAVA_OPTS" ] || JAVA_OPTS="-Xms1024M -Xmx1024M -Xss1M -XX:MaxPermSize=256M -XX:+UseParallelGC"
10+
11+
# we will use akka_classpath instead the app_classpath
12+
[ -n "$akka_classpath" ] || akka_classpath="$AKKA_HOME/lib/*:$AKKA_HOME/conf"
13+
14+
java $JAVA_OPTS -cp "$akka_classpath" -Dakka.home="$AKKA_HOME" -Dakka.kernel.quiet=false akka.kernel.Main $app_mainclass
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
echo off
2+
3+
set _JAVA_OPTS=%_JAVA_OPTS% %_JAVA_PARAMS%
4+
5+
@@APP_DEFINES@@
6+
7+
set AKKA_HOME=%~dp0..
8+
set JAVA_OPTS=-Xmx1024M -Xms1024M -Xss1M -XX:MaxPermSize=256M -XX:+UseParallelGC
9+
set AKKA_CLASSPATH=%AKKA_HOME%\lib\*;%AKKA_HOME%\config;%AKKA_HOME%\lib\akka\*
10+
11+
java %JAVA_OPTS% -cp "%AKKA_CLASSPATH%" -Dakka.home="%AKKA_HOME%" akka.kernel.Main %APP_MAIN_CLASS% %*

src/main/scala/com/typesafe/sbt/PackagerPlugin.scala

+2
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,8 @@ object SbtNativePackager extends Plugin
4848
private[this] def genericMappingSettings: Seq[Setting[_]] = packagerSettings ++ mapGenericFilesToLinux ++ mapGenericFilesToWindows
4949
def java_application: Seq[Setting[_]] =
5050
genericMappingSettings ++ archetypes.JavaAppPackaging.settings
51+
def akka_application: Seq[Setting[_]] =
52+
genericMappingSettings ++ archetypes.AkkaApp.settings
5153
def java_server: Seq[Setting[_]] =
5254
genericMappingSettings ++ archetypes.JavaServerAppPackaging.settings
5355
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
package com.typesafe.sbt
2+
package packager
3+
package archetypes
4+
5+
/**
6+
* Created by max.cai on 2014-09-27.
7+
*/
8+
object AkkaApp extends JavaApp {
9+
val bashTemplate = "akka-bash-template"
10+
val batTemplate = "akka-bat-template"
11+
}

src/main/scala/com/typesafe/sbt/packager/archetypes/JavaApp.scala

+23-9
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,14 @@ import SbtNativePackager._
1818
*
1919
* **NOTE: EXPERIMENTAL** This currently only supports universal distributions.
2020
*/
21-
object JavaAppPackaging {
21+
object JavaAppPackaging extends JavaApp {
22+
val bashTemplate = "bash-template"
23+
val batTemplate = "bat-template"
24+
25+
}
26+
trait JavaApp {
27+
val bashTemplate: String
28+
val batTemplate: String
2229

2330
def settings: Seq[Setting[_]] = Seq(
2431
// Here we record the classpath as it's added to the mappings separately, so
@@ -85,10 +92,14 @@ object JavaAppPackaging {
8592
def makeUniversalBinScript(defines: Seq[String], tmpDir: File, name: String, sourceDir: File): Option[File] =
8693
if (defines.isEmpty) None
8794
else {
88-
val defaultTemplateLocation = sourceDir / "templates" / "bash-template"
89-
val scriptBits =
90-
if (defaultTemplateLocation.exists) JavaAppBashScript.generateScript(defines, defaultTemplateLocation.toURI.toURL)
91-
else JavaAppBashScript.generateScript(defines)
95+
val defaultTemplateLocation = sourceDir / "templates" / bashTemplate
96+
val defaultTemplateSource = getClass.getResource(bashTemplate)
97+
98+
val template = if (defaultTemplateLocation.exists)
99+
defaultTemplateLocation.toURI.toURL
100+
else defaultTemplateSource
101+
102+
val scriptBits = JavaAppBashScript.generateScript(defines, template)
92103
val script = tmpDir / "tmp" / "bin" / name
93104
IO.write(script, scriptBits)
94105
// TODO - Better control over this!
@@ -99,10 +110,13 @@ object JavaAppPackaging {
99110
def makeUniversalBatScript(replacements: Seq[(String, String)], tmpDir: File, name: String, sourceDir: File): Option[File] =
100111
if (replacements.isEmpty) None
101112
else {
102-
val defaultTemplateLocation = sourceDir / "templates" / "bat-template"
103-
val scriptBits =
104-
if (defaultTemplateLocation.exists) JavaAppBatScript.generateScript(replacements, defaultTemplateLocation.toURI.toURL)
105-
else JavaAppBatScript.generateScript(replacements)
113+
val defaultTemplateLocation = sourceDir / "templates" / batTemplate
114+
val defaultTemplateSource = getClass.getResource(batTemplate)
115+
val template = if (defaultTemplateLocation.exists)
116+
defaultTemplateLocation.toURI.toURL
117+
else defaultTemplateSource
118+
119+
val scriptBits = JavaAppBatScript.generateScript(replacements, template)
106120
val script = tmpDir / "tmp" / "bin" / (name + ".bat")
107121
IO.write(script, scriptBits)
108122
Some(script)
+15
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
import NativePackagerKeys._
2+
3+
packageArchetype.akka_application
4+
5+
name := """test-akka"""
6+
7+
mainClass in Compile := Some("HelloKernel")
8+
9+
version := "1.0"
10+
11+
libraryDependencies ++= Seq(
12+
"com.typesafe.akka" %% "akka-kernel" % "2.3.4",
13+
"com.typesafe.akka" %% "akka-actor" % "2.3.4",
14+
"com.typesafe.akka" %% "akka-testkit" % "2.3.4"
15+
)
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
addSbtPlugin("com.typesafe.sbt" % "sbt-native-packager" % sys.props("project.version"))
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
import akka.actor.{ Actor, ActorSystem, Props }
2+
import akka.kernel.Bootable
3+
4+
case object Start
5+
6+
class HelloActor extends Actor {
7+
val worldActor = context.actorOf(Props[WorldActor])
8+
9+
def receive = {
10+
case Start => worldActor ! "Hello"
11+
case message: String =>
12+
println("Received message '%s'" format message)
13+
}
14+
}
15+
16+
class WorldActor extends Actor {
17+
def receive = {
18+
case message: String => sender() ! (message.toUpperCase + " world!")
19+
}
20+
}
21+
22+
class HelloKernel extends Bootable {
23+
val system = ActorSystem("hellokernel")
24+
25+
def startup = {
26+
system.actorOf(Props[HelloActor]) ! Start
27+
}
28+
29+
def shutdown = {
30+
system.shutdown()
31+
}
32+
}

src/sbt-test/universal/test-akka/test

+3
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
# generate Akka startup script
2+
> stage
3+
$ exists target/universal/stage/bin/test-akka

src/sphinx/DetailedTopics/archetypes.rst

+12
Original file line numberDiff line numberDiff line change
@@ -123,6 +123,18 @@ to your packaging for Debian. *Note:* All specified users are **deleted** on an
123123

124124
*Note:* It is not a good idea to use **root** as the ``appUser`` for services as it represents a security risk.
125125

126+
Akka Microkernel Application
127+
----------------------------
128+
129+
Akka microkerneal application is simlar to a Java Command Line application. Instead to run the ``mainClass``, akka microkernel application need run java with main class ``akka.kernel.Main``. The bash/bat script that starts up a Akka application is copied from Akka distribution. To use this archetype in your build, do the following in your ``build.sbt``:
130+
131+
.. code-block:: scala
132+
133+
packageArchetype.akka_application
134+
135+
name := "A-package-friendly-name"
136+
137+
mainClass in Compile := Some("HelloKernel")
126138
127139
128140
Overriding Templates

0 commit comments

Comments
 (0)