Как использовать собственный упаковщик sbt с подпроектами (sbt 0.13)

У меня есть проект sbt с множеством подпроектов и зависимостей от внешних библиотек. build.sbt звучит так:

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]                   ^

Должен признаться, что я не получил реальной подсказки из документации плагина родного упаковщика. Как я могу заархивировать то, что я хочу иметь?

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

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


person Dirk Hillbrecht    schedule 11.12.2013    source источник


Ответы (1)


Ну, ответ был довольно простым, как только я немного протестировал. Во-первых, поместите собственный упаковщик в глобальный проект 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, но я не нашел способа настроить собственный упаковщик таким образом.

person Dirk Hillbrecht    schedule 02.01.2014
comment
Спасибо за самостоятельный ответ. Я нашел это весьма полезным :) - person opyate; 06.01.2015
comment
Этот ответ, вероятно, следует обновить, чтобы отразить использование средства sbt AutoPlugin, используемого в строке 1.x sbt-native-packager. - person metasim; 20.01.2016
comment
Что ж, действительно, ответу уже больше двух лет. К сожалению, с тех пор мы не меняли и не обновляли наши наборы инструментов, поэтому я должен признать, что у меня нет опыта работы с AutoPlugin. :-( - person Dirk Hillbrecht; 21.01.2016