Im ersten Teil der mehrteiligen Blog-Serie XBMC Desktop Client in Scala habe ich einige einleitende Worte zu diesem Projekt, XBMC sowie zu der auf JSON basierenden Schnittstelle verloren. In diesem Projekt werde ich unter anderem zeigen, wie es über WebSockets möglich ist, die Schnittstelle anzusprechen, um ein auf XBMC basierendes System fernzusteuern.

In diesem Artikel möchte ich die Konfiguration eines Multimodul-Projektes in dem Build-Management-Tool sbt vorstellen.

Update vom 21.04.2014

Beispielcode ist bei github zu finden, unter: sbt-multimodule-setup

sbt

Jeder Java-Entwickler wird schon einmal mit den branchenüblichen Tools Maven oder Ant gearbeiten haben. Mit sbt - dem scala build tool - jedoch eher weniger. Was liegt da also näher als sich - vor allem als Scala-Neuling - auch mal mit sbt auseinanderzusetzen.

sbt ist also ein Build-Management-Tool - vergleichbar mit Maven oder Ant - für verschiedene Java-Sprachen, jedoch der de facto Standard der Programmiersprache Scala. Neben den üblichen Features wie dem Kompilieren von mehreren Multimodul-Projekten, Erstellen und Deployen von Archiven (Jar, War, etc), der einfachen und sehr kleinen Konfiguration von Projekten (Die XML-Hölle von Maven!), ist meiner Meinung nach das kontinuierliche Kompilieren (continuous compilation) und Testen (continuous testing) mittels triggered execution das Killerfeature von sbt schlechthin!

sbt Konfiguration

Auf das Aufsetzen und Einrichten von sbt möchte ich an dieser Stelle verzichten, stattdessen auf die hervorragende Dokumentation verweisen und direkt mit der Konfiguration der sbt-Dateien beginnen.

Das Projekt besteht aus dem Oberprojekt xbmc-desktop und den Unterprojekten backend und frontend. In den jeweiligen Ordnern liegt jeweils eine eigene build.sbt:

xbmc-desktop

name := "XBMC Desktop Client"
version := "1.0.0"
scalaVersion := "2.10.4"
resolvers += "Typesafe Repository" at "http://repo.typesafe.com/typesafe/releases/"
fork in run := true
scalacOptions ++= Seq("-unchecked", "-deprecation", "-feature")
lazy val backend = project
lazy val frontend = project.dependsOn(backend)

Die Konfiguration des Oberprojektes ist gerade mal 15 Zeilen lang, jedoch trotzdem verständlich. Die wichtigen Einstellungen finden sich unten und beschreiben die Unterprojekte. Das Projekt frontend besitzt zudem backend als direkte Abhängigkeit.

backend

name := "Backend"
version := "1.0.0"
libraryDependencies += "com.ning" % "async-http-client" % "1.8.3"
libraryDependencies += "org.json4s" % "json4s-ast_2.10" % "3.2.8"
libraryDependencies += "org.json4s" % "json4s-core_2.10" % "3.2.8"
libraryDependencies += "org.json4s" % "json4s-jackson_2.10" % "3.2.8"
libraryDependencies += "org.json4s" % "json4s-native_2.10" % "3.2.8"
libraryDependencies += "io.netty" % "netty" % "3.9.0.Final"
libraryDependencies += "org.slf4j" % "slf4j-api" % "1.7.6"
libraryDependencies += "org.slf4j" % "slf4j-simple" % "1.7.6"
libraryDependencies += "com.typesafe.akka" %% "akka-actor" % "2.3.1"
libraryDependencies += "org.scalatest" % "scalatest_2.10" % "2.0" % "test"

Im Projekt backend sind lediglich alle eingesetzten Bibliotheken konfiguriert. Für die WebSocket-Anbindung setze ich AsyncHttpClient und Json4s als JSON-Bibliothek ein. Weiterhin verwende ich das bereits in Teil 1 der Blog-Serie erwähnte Framework zur verteilten und parallelen Programmierung Akka.

frontend

name := "Frontend"
version := "1.0.0"
javaHome := Some(file(System.getenv("JAVA_HOME")))
// http://stackoverflow.com/questions/14123749/how-to-detect-javafx-runtime-jar-in-sbt
unmanagedJars in Compile <+= javaHome map { jh => new File( jh.getOrElse(syserror("Error, could not get java home")),"jre/lib/jfxrt.jar" ) }

Im Frontend kommt JavaFX zum Einsatz. JavaFX wird zwar ab Version 8 standardmäßig im JDK mitgeliefert, jedoch ist es in Java 7 und älter nicht als Standard-Bibliothek eingebunden. Um dies nachzuholen, habe ich mich eines einfachen Tricks bedient. Dieser Workaround ist in Java 8 nicht mehr notwendig.

Fertig. Nach einem einfachen sbt compile werden einmalig die benötigten Bibliotheken runtergeladen und die bisher leeren Projekte kompiliert.

blogroll
tags