2017-05-10 7 views
0

J'essaie de créer des versions avec des fichiers de configuration différés avec l'aide de SBT Native Packager. J'ai une disposition standard de projet pour les projets Scala:SBT Native Packager: Construire le même paquet avec différentes configurations

my-app 
--/project 
----/build.properties 
----/plugins.sbt 
--/src 
----/main 
------/java 
------/resources 
------/scala 
----/test 
------/java 
------/resources 
------/scala 
build.sbt 

J'ajouté le plugin-Packager SBT natif de mon projet et a décidé de répéter l'SBT submodule approach.

Voilà comment mon fichier build.sbt ressemble:

import sbt.Keys._ 

scalaVersion in ThisBuild := "2.12.1" 

lazy val app = project 
    .in(file(".")) 
    .settings(
    name := "backend", 
    version := "1.0", 
    libraryDependencies ++= { 
     val akkaVersion = "2.4.17" 
     val akkaHttpVersion = "10.0.5" 
     Seq(
     "com.typesafe.akka" %% "akka-actor" % akkaVersion, 
     "com.typesafe.akka" %% "akka-http" % akkaHttpVersion, 
     "com.typesafe.akka" %% "akka-http-spray-json" % akkaHttpVersion 
    ) 
    } 
) 

lazy val devPackage = project 
    .in(file("build/dev")) 
    .enablePlugins(JavaAppPackaging) 
    .settings(
    name := "backend-dev", 
    resourceDirectory in Compile := (resourceDirectory in (app, Compile)).value, 
    mappings in Universal += { 
     ((resourceDirectory in Compile).value/"dev.conf") -> "conf/application.conf" 
    } 
) 
    .dependsOn(app) 

Et voici application.conf et dev.conf (les deux sont situés dans src/main/resources:

akka { 
    loglevel = INFO 
    stdout-loglevel = INFO 
    loggers = ["akka.event.slf4j.Slf4jLogger"] 
    default-dispatcher { 
    fork-join-executor { 
     parallelism-min = 8 
    } 
    } 
    http { 
    server { 
     server-header = "PinPoint REST API" 
     request-timeout = "10.seconds" 
    } 
    } 
} 

database { 
    dataSourceClass = "org.postgresql.ds.PGSimpleDataSource" 
    properties = { 
    databaseName = "pg_db" 
    user = "alex" 
    password = "" 
    } 
    numThreads = 10 
} 

et

include "application" 

database { 
    dataSourceClass = "org.postgresql.ds.PGSimpleDataSource" 
    properties = { 
    databaseName = "pg_db_dev" 
    user = "alex" 
    password = "secure_password" 
    } 
    numThreads = 10 
} 

Après avoir couru sbt devPackage/stage dans le terminal que je reçois nouveau répertoire « build » dans la folde racine r du projet. Mais à l'intérieur du: build/dev/target/universal/stage/ Il n'y a pas de dossier "bin" avec un script sh exécutable.

Alors, comment résoudre ce problème?

+0

Si vous avez différentes classes principales, vous devez spécifier un d'entre eux comme MainClass dans Compile: = Certains ("foo.bar .Principale"). Voir http://www.scala-sbt.org/sbt-native-packager/archetypes/java_app/ pour plus de détails. – kardapoltsev

+0

@kardapoltsev Je n'ai qu'une seule classe principale –

Répondre

4

Universal Packager ne créera pas de scripts de démarrage si le paramètre mainClass n'est pas défini - et sbt ne le définira pas automatiquement à partir des fichiers jar de votre chemin de classe.

Tout ce que vous devez faire est d'ajouter le paramètre à votre projet devPackage:

lazy val devPackage = project 
    .in(file("build/dev")) 
    .enablePlugins(JavaAppPackaging) 
    .settings(
    name := "backend-dev", 
    resourceDirectory in Compile := (resourceDirectory in (app, Compile)).value, 
    // TODO: Use real classname here: 
    mainClass in Compile := Some("my.main.ClassName"), 
    mappings in Universal += { 
     ((resourceDirectory in Compile).value/"dev.conf") -> "conf/application.conf" 
    } 
) 
    .dependsOn(app)