Scala 如何将我的应用程序打包为多个存档?
我有一个应用程序,我希望通过定义组件将其作为一组ZIP或RPM(甚至fat JAR)归档文件交付 例如,我希望有一个任务为我的应用程序构建一个包含所有构建JAR的ZIP存档,以及另一个包含所有依赖项的存档Scala 如何将我的应用程序打包为多个存档?,scala,sbt,Scala,Sbt,我有一个应用程序,我希望通过定义组件将其作为一组ZIP或RPM(甚至fat JAR)归档文件交付 例如,我希望有一个任务为我的应用程序构建一个包含所有构建JAR的ZIP存档,以及另一个包含所有依赖项的存档 如何做到这一点?使用sbt-1.2,您可以实现这一点 在多项目构建中,sbt native packager添加了一个任务,Universal/packageBin,它为您的应用程序构建一个ZIP存档,并使用一个漂亮的shell脚本来定义其类路径。它就像一个符咒: //在(子)项目定义中(一个
如何做到这一点?使用
sbt-1.2
,您可以实现这一点
在多项目构建中,sbt native packager
添加了一个任务,Universal/packageBin
,它为您的应用程序构建一个ZIP存档,并使用一个漂亮的shell脚本来定义其类路径。它就像一个符咒:
//在(子)项目定义中(一个.sbt文件,任何人)
lazy val MySubProject1=(文件中的项目(“MySubProject1”))
.enablePlugins(JavaAppPackage)
这允许您:
sbt:MyProject>project MySubProject1
sbt:MySubProject1>通用:packageBin
[...]
添加:lib/
添加:lib/MySubProject2-0.1.0.jar
添加:lib/MySubProject1-0.1.0.jar
添加:lib/org.apache.kafka.kafka_2.11-0.10.0.1.jar
[...]
添加:bin/
添加:bin/MySubProject1
添加:bin/MySubProject1.bat
[成功][…]
^D
$unzip-l target/universal/MySubProject1.zip#列出存档内容:)
[...]
好的,现在我们想输出两个ZIP存档:一个用于您的jar(sbt构建的),另一个用于他们的jar(sbt下载的)。这并不容易,但可以实现 为了组织事情,我们将在scala文件中定义一些代码。假设以下项目层次结构:
MyProject|
├── build.sbt |定义modules.sbt中未定义的所有内容
├── modules.sbt |玷污所有(子)项目
├── 项目/|
│ ├── Settings.scala |定义应用于(子)项目的设置
│ └── Deps.scala |定义依赖项
├── MySubProject1/|这是您将打包的子项目
│ └── src/|
├── ... | 其中一些子项目是MuSubProject1的依赖项
└── MySubProjectn/|
└── src/|
modules.sbt
:将我们的打包设置应用于MySubProject1
lazy val MySubProject1=(文件中的项目(“MySubProject1”))
.设置(
名称:=“AwesomeApp”,
Settings.Common++Settings.Package,//这是magic操作的(Settings.Package)
libraryDependencies++=Deps.Spark,
)
.dependsOn(MySubProject2)
.enablePlugins(JavaAppPackaging)//这仍然是必需的
project/Settings.scala
:定义打包所需的设置
从一个简单的scala对象开始,我们将扩展我们的打包策略
导入sbt_
导入密钥_
//额外进口(0/)
对象设置{
延迟值公共值=Seq(
版本:=“0.1.0”,
scalaVersion:=“2.11.8”,
//其他设置
)
// (1/, 2/ & 3/)
}
0/添加一些导入
import com.typesafe.sbt.SbtNativePackager.autoImport_
导入com.typesafe.sbt.packager.universal.UniversalPlugin.autoImport_
导入com.typesafe.sbt.packager.universal.Archives.makeNativeZip
1/为每个目标存档添加一个配置
val Application=config(“应用程序”)
val Dependencies=config(“依赖项”)
2/定义我们的分区(哪个文件放在哪个配置中)
/@简要返回此文件所属的配置。
private[this]def configOf(映射:(文件,字符串)):配置=映射匹配{
案例(文件)=>
如果(file.getPath()包含“/cache/”)依赖项//这取决于**您的**上下文,应该加以改进
其他应用程序
}
//! @简要返回此配置的文件筛选器,以便在文件映射上与@c filter一起应用。
private[this]def filterOf(conf:Configuration):((文件,字符串))=>Boolean={
映射:(文件,字符串)=>configOf(映射)==conf
}
3/为每个配置创建ZIP存档
/@简要定义此配置的任务包bin。
private[this]def packageDefinition(conf:Configuration):设置[Task[File]]={
conf/packageBin:={
//如何将JavaAppPackaging插件添加到项目中?请参见'thisProject.value.autoPlugins`?
val目标=(通用/映射)。值过滤器过滤器(conf)
makeNativeZip(target.value,s“${packageName.value}-${conf.name}”,targets,None,Nil)
}
}
/**
*@brief将打包配置添加到项目中。
*
*适用于:
*@code
lazy val子项目=(文件(“目录”)中的项目)。设置(
名称:=“MyAwesomeSubProject”,
设置。包,
).enablePlugins(JavaAppPackage)
*@endcode
*/
def程序包=Seq(
维护者:=”YSC@example.com",
packageName:=s“${name.value}”,
包装定义(应用),
packageDefinition(依赖项),
)
就是这样!现在,您可以在子项目上应用应用程序:packageBin
和依赖项:packageBin
,分别生成AwesomeApp应用程序.zip
和AwesomeApp依赖项.zip
享受吧