Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Scala 如何将我的应用程序打包为多个存档?_Scala_Sbt - Fatal编程技术网

Scala 如何将我的应用程序打包为多个存档?

Scala 如何将我的应用程序打包为多个存档?,scala,sbt,Scala,Sbt,我有一个应用程序,我希望通过定义组件将其作为一组ZIP或RPM(甚至fat JAR)归档文件交付 例如,我希望有一个任务为我的应用程序构建一个包含所有构建JAR的ZIP存档,以及另一个包含所有依赖项的存档 如何做到这一点?使用sbt-1.2,您可以实现这一点 在多项目构建中,sbt native packager添加了一个任务,Universal/packageBin,它为您的应用程序构建一个ZIP存档,并使用一个漂亮的shell脚本来定义其类路径。它就像一个符咒: //在(子)项目定义中(一个

我有一个应用程序,我希望通过定义组件将其作为一组ZIP或RPM(甚至fat JAR)归档文件交付

例如,我希望有一个任务为我的应用程序构建一个包含所有构建JAR的ZIP存档,以及另一个包含所有依赖项的存档


如何做到这一点?

使用
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

享受吧