2013-12-11 17 views
6

Ho un progetto sbt con una moltitudine di sottoprogetti e dipendenze di librerie esterne. build.sbt va in questo modo:Come utilizzare il packager nativo di sbt con i sottoprogetti (sbt 0.13)

val extlib1 = "xy.xxx" % "lib1" % "1.0+" 
val extlib2 = "xy.yyy" % "lib2" % "1.0+" 
val extlib3 = "xy.zzz" % "lib3" % "1.0+" 

lazy val core=project settings (
    name:="cor", 
    libraryDependencies++=Seq(extlib1) 
) 

lazy val servercore=project settings (
    name:="srvcore", 
    libraryDependencies++=Seq(extlib1,extlib2) 
) dependsOn(core) 

lazy val masterserver=project settings (
    name:="mastersrv", 
    mainClass:=Some("masterserver") 
) dependsOn(servercore) 

lazy val otherserver=project settings (
    name:="othersrv", 
    libraryDependencies++=Seq(extlib3), 
    mainClass:=Some("otherserver") 
) dependsOn(servercore) 

// Only for aggregating the builds of the subprojects 
lazy val root=project in file(".") settings(name:="proj") aggregate(
    core,servercore,masterserver,otherserver 
) 

Quindi in realtà il progetto crea diversi programmi ("Masterserver", "otherserver") che dipendono da librerie esterne e un sottoinsieme dei sottoprogetti di questo progetto stesso.

Quello che voglio avere è un set completo di JAR necessari per avviare il server master o l'altro server, separati per ogni. Quindi, mi piacerebbe avere ad es. masterserver/target/<whatever> contenente

mastersrv.jar 
srvcore.jar (needed by mastersrv.jar) 
cor.jar  (needed by srvcore.jar) 
lib1.jar  (needed by mastersrv and srvcore) 
lib2.jar  (needed by srvcore) 
<whatever>.jar (further libs needed by lib1 or lib2) 

e un otherserver/target/<whatever> con contenuti simili (avrebbe dovuto aggiungere lib3.jar anche, come ciò che è necessario per othersrv.jar.

Come farlo? È possibile eseguire questo con il packager nativa? Emissione stage nel progetto principale non fa nulla (perché non c'è mailClass?). l'emissione di masterserver/state dà un messaggio di errore

> masterserver/stage 
[error] No such setting/task 
[error] masterserver/stage 
[error]     ^

I mu Devo ammettere che non ho una vera idea della documentazione del plugin packager nativo. Come posso archiviare ciò che voglio avere?

Modifica: Naturalmente, non sono legato alle directory. Se ottengo più file ZIP nella directory principale target, è o.k., anche. Voglio solo avere tutte le dipendenze di un sottoprogetto in una posizione.

Modifica 2: Ok, ho imparato che il gioco! quadro fa esattamente quello che voglio. E usa il packager nativo di sbt per questo. Come posso ottenere una confezione universale ricorsiva di sottoprogetti in progetti non gestiti da sbt-hand che usano Java come linguaggio di programmazione?

risposta

7

Bene, la risposta è stata abbastanza semplice una volta che ho provato un po 'in giro. In primo luogo, mettere il confezionatore nativo nel progetto-global project/plugins.sbt

addSbtPlugin("com.typesafe.sbt" % "sbt-native-packager" % "0.6.4") 

Poi, mettere la configurazione per il packager nativo nel build.sbt nel sottoprogetto. Nell'esempio di cui sopra, inserire il seguente nel masterserver/build.sbt:

// Setup the packager 
packageArchetype.java_application 

// Enable JAR export for staging 
exportJars := true 

L'insieme dei file JAR necessari sarà messo in directory del sottoprogetto target, in questo esempio in masterserver/target/universal/stage/lib

Il resto della configurazione del sottoprogetto possono soggiornare nel globale build.sbt, ma non ho trovato alcun modo di configurare il packager nativo in questo modo.

+0

Grazie per l'auto-risposta. L'ho trovato abbastanza utile :) – opyate

+1

Probabilmente questa risposta dovrebbe essere aggiornata per riflettere l'uso della funzione sbt 'AutoPlugin' utilizzata nella riga 1.x di' sbt-native-packager'. – metasim

+0

Beh, in effetti, la risposta ora ha più di due anni. Sfortunatamente, non abbiamo modificato o aggiornato le nostre toolchain da allora, quindi devo ammettere che non ho esperienza con AutoPlugin. :-( –

Problemi correlati