TL; DR версия: использовать отдельные проекты sbt.
Как вы, вероятно, отметили, плагин JDKPackager
создает собственные пакеты на разных платформах. Уловкой для создания и тестирования первичных артефактов является публикация их на сервере артефактов, а затем отдельный проект для создания установщика.
Если вам ваш проект нужен только один установщик каждой платформы, то все, что вам нужно нужно сделать, это добавить зависимость, установите ключ mainClass
и добавьте enablePlugins(JDKPackagerPlugin)
:
enablePlugins(JDKPackagerPlugin)
name := "JDKPackagerPlugin Example"
version := "0.1.0"
organization := "com.foo.bar"
libraryDependencies += "com.foo.bar" %% "myProject" % "0.1.0"
mainClass in Compile := Some("com.foo.bar.ExampleApp")
// Optional: provide application file associations
jdkPackagerAssociations := Seq(
FileAssociation("foobar", "application/foobar", "Foobar file type"),
FileAssociation("barbaz", "application/barbaz", "Barbaz file type", jdkAppIcon.value)
)
Если у вас есть сценарий где вам нужно несколько инсталляторов на платформу (например, инструменты командной строки или графический интерфейс), я обычно структурирую проект, чтобы иметь подкаталог под названием «упаковка» с автономным файлом build.xml
, объединяющий отдельные подпроекты, определяющие каждую конфигурацию установщика:
// Settings common across subprojects. Could also do this with a
// project-specific `AutoPlugin`
val baseSettings = Seq(
libraryDependencies += "com.foo.bar" %% "myProject" % "0.1.0"
)
// The packaging aggregation project
lazy val packaging = project
.in(file("."))
.aggregate(a, b)
// Project with CLI configuration
lazy val a = Project(id = "my-project-cli", base = file("my-project-cli"))
.settings(baseSettings: _*)
// Project with GUI configuration
lazy val b = Project(id = "my-project-gui", base = file("my-project-gui"))
.settings(baseSettings: _*)
// Create a task for invoking the sub-projects as needed
val packageSubs = taskKey[Seq[File]]("Build packages in subprojects")
(packageSubs in packaging) := {
Seq(
(packageBin.in(a, Universal)).value,
(packageBin.in(b, JDKPackager)).value
)
}
Я считаю, что разбиение конфигураций установщика, как это, помогает поддерживать прямую зависимость и эффекты конкретных настроек.
«Очевидно, для этого конкретные задачи SBT для платформы должны будут работать на этой платформе». Это совершенно не очевидно, это типичное ограничение множества пакетов, в том числе «javapackager», используемое под капотом SBT Native Packager, но мой собственный Java-упаковщик может создавать собственные пакеты OS X под Windows, GNU Linux DEB & RPM в Mac OS X и Windows-исполняемые установщики Windows под GNU Linux: http://tuer.sourceforge.net/en/documentation/#jndt. Например, можно выполнить некоторую непрерывную интеграцию в GNU Linux, ориентируясь на Windows и OS X. Вы можете вызвать JNDT с ant4sbt. – gouessej