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)
)
如果您有每个平台需要多个安装程序的场景(例如,命令行工具与 GUI),我通常会构建一个项目,使其具有一个名为“packaging”的子目录,其中包含一个独立的 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
)
}
我发现像这样分解安装程序配置有助于保持依赖关系以及特定自定义的效果。