2012-03-19 21 views
6

Tengo problemas para crear y ejecutar un proyecto de SBT.Proyecto de construcción de varios módulos de Scala SBT a jar ejecutables

  • El proyecto "protocolo" es utilizado por varios módulos, incluido el "daemon".

  • El proyecto "daemon" se debe empaquetar como un archivo ejecutable.

¿Cuál es la forma "correcta" de hacer esto?

Aquí es mi Build.scala:

object MyBuild extends Build { 
lazy val buildSettings = Seq(
    organization := "com.example", 
    version  := "1.0-SNAPSHOT", 
    scalaVersion := "2.9.1" 
    ) 

lazy val root = Project(
    id = "MyProject", 
    base = file("."), 
    aggregate = Seq(protocol, daemon) 
    ) 

lazy val protocol = Project(
    id = "Protocol", 
    base = file("Protocol") 
    ) 

lazy val daemon = Project(
    id = "Daemon", 
    base = file("Daemon"), 
    dependencies = Seq(protocol) 
    ) 
// (plus more projects) 

Respuesta

7

La forma correcta de hacer esto es utilizar uno de los complementos de SBT para la producción de frascos. He probado ambos one-jar y assembly y ambos tienen soporte para excluir bibliotecas de su jar. Puede agregar la configuración a proyectos individuales para que solo algunos de ellos produzcan frascos.

Personalmente utilizo el ensamblaje, pero como señala this post, se encontrará con problemas si tiene nombres de archivos superpuestos.

Editar:

Para su ejemplo anterior deberá añadir los siguientes importaciones en la parte superior:

import sbtassembly.Plugin._ 
import AssemblyKeys._ 

Se podría modificar el proyecto para tener este aspecto:

lazy val daemon = Project(
    id = "Daemon", 
    base = file("Daemon"), 
    dependencies = Seq(protocol), 
    settings = assemblySettings 
) 

También necesita agregar lo siguiente a su project/plugins.sbt (para sbt .11):

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

resolvers += Resolver.url("sbt-plugin-releases", 
    new URL("http://scalasbt.artifactoryonline.com/scalasbt/sbt-plugin-releases/"))(Resolver.ivyStylePatterns) 

Si decide usar Assembly, es probable que necesite eliminar los archivos duplicados. Aquí hay un ejemplo del código de ensamblado para excluir archivos duplicados de log4j.properties en un proyecto llamado "projectName". Esto debe agregarse como parte de la secuencia de "configuraciones" para el proyecto. Tenga en cuenta que la segunda declaración de recopilación es la implementación básica y es obligatoria.

excludedFiles in assembly := { (bases: Seq[File]) => 
    bases.filterNot(_.getAbsolutePath.contains("projectName")) flatMap { base => 
    //Exclude all log4j.properties from other peoples jars 
    ((base * "*").get collect { 
     case f if f.getName.toLowerCase == "log4j.properties" => f 
    }) ++ 
    //Exclude the license and manifest from the exploded jars 
    ((base/"META-INF" * "*").get collect { 
     case f if f.getName.toLowerCase == "license" => f 
     case f if f.getName.toLowerCase == "manifest.mf" => f 
    }) 
    } 
} 
+0

Gracias, eso funciona bien. También tuve que agregar el complemento en mis plugins.sbt; podría agregar eso en su respuesta para ayudar a otros también. Cerraré la pregunta mañana. Parece que lo único que realmente necesitaba era agregar la configuración mainClass: = Some ("com.example.Main") a mi proyecto, siempre que gestionara las dependencias/classpath yo mismo. - Eso estaba bastante escondido en la documentación, o tal vez estoy solo ciego :-) – Arve

Cuestiones relacionadas