2013-12-11 2 views
6

У меня есть проект sbt с множеством подпроектов и внешних зависимостей библиотеки. build.sbt выглядит следующим образом:Как использовать sbt native packager с подпроектами (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 
) 

Так на самом деле проект создает несколько программ («masterserver», «otherserver»), которые зависят от внешних библиотек и подмножества подпроектов самого этого проекта.

Я хочу иметь полный набор JAR, необходимых для запуска главного сервера или другого сервера, для каждого. Итак, я хотел бы иметь, например, masterserver/target/<whatever> содержащий

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) 

и otherserver/target/<whatever> с аналогичным содержанием (она должна была бы добавить lib3.jar также, как это требуется по othersrv.jar.

Как это сделать? Могу ли я выполнить это с родной упаковщик? Выдавший stage в корневом проекте ничего не делает (потому что нет mailClass?). Выдача masterserver/state выдает сообщение об ошибке

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

I му признаю, что я не понимаю реальную информацию из документации плагина native packager. Как я могу архивировать то, что хочу?

Редактировать: Конечно, я не привязан к файлу каталога. Если я получаю несколько ZIP-файлов в основном каталоге target, это тоже o.k. Я хочу только иметь все зависимости подпроекта в одном месте.

Редактировать 2: Хорошо, я узнал, что Игра! framework делает именно то, что я хочу. И для этого он использует собственный пакет sbt. Как я могу архивировать рекурсивную универсальную упаковку подпроектов в проектах, не связанных с игрой sbt, которые используют Java в качестве языка программирования?

ответ

7

Ну, ответ был довольно прост, как только я немного проверил. Во-первых, поставить родной упаковщик в проекте-глобальной project/plugins.sbt

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

Затем установите конфигурацию для нативного упаковщик в build.sbt в подпроекта. В приведенном выше примере, поместите следующее в masterserver/build.sbt:

// Setup the packager 
packageArchetype.java_application 

// Enable JAR export for staging 
exportJars := true 

Набор необходимых файлов JAR будет введен в target каталог подпроекта, в этом примере в masterserver/target/universal/stage/lib

Остальная часть конфигурации подпроекта может остаться в глобальном build.sbt, но я не нашел способа настроить собственный пакет.

+0

Спасибо за самоответ. Я нашел это весьма полезным :) – opyate

+1

Этот ответ, вероятно, должен быть обновлен, чтобы отразить использование средства sbt 'AutoPlugin', используемого в строке 1.x' sbt-native-packager'. – metasim

+0

Ну, действительно, ответ теперь более двух лет. К сожалению, с тех пор мы не изменили или не обновили наши инструментальные цепочки, поэтому я должен признать, что у меня нет опыта работы с AutoPlugin. :-( –

 Смежные вопросы

  • Нет связанных вопросов^_^