如何使用 sbt-assembly 和 sbt-native-packager 构建 deb 包以包含单个程序集 jar?
Posted
技术标签:
【中文标题】如何使用 sbt-assembly 和 sbt-native-packager 构建 deb 包以包含单个程序集 jar?【英文标题】:How to build deb package to contain single assembly jar with sbt-assembly and sbt-native-packager? 【发布时间】:2014-08-08 07:36:36 【问题描述】:是否可以使用sbt-assembly
和sbt-native-packager
插件来创建一个Java 应用程序原型安装,而不是让<app>/lib
中的项目jar 及其依赖项只包含程序集jar?
我已经构建了一个 Spark 应用程序,我想将程序集添加到上下文中,而不是单独添加每个 jar。
编辑:我需要为部署构建 deb 包。我希望 deb 包包含程序集而不是项目和依赖 jar。
文件系统布局应该是
<install_dir>
bin
appname
conf
application.conf
lib
appname-assembly.jar
sbt-native-packager 为 /usr/bin 添加一个符号链接,这很方便但不是必需的。
【问题讨论】:
能否添加预期的 deb 包布局以及文件与项目的关系? 编辑问题以添加文件布局 【参考方案1】:本机包可以做到这一点。一个完整的例子可以找到on github 您必须更改 mappings 和 scriptClasspath
您的 build.sbt 应包含以下部分
// the assembly settings
assemblySettings
// we specify the name for our fat jar
jarName in assembly := "assembly-project.jar"
// using the java server for this application
packageArchetype.java_server
maintainer in Linux := "Nepomuk Seiler <nepomuk.seiler@mukis.de>"
packageSummary in Linux := "Custom application configuration"
packageDescription := "Custom application configuration"
// removes all jar mappings in universal and appends the fat jar
mappings in Universal :=
// universalMappings: Seq[(File,String)]
val universalMappings = (mappings in Universal).value
val fatJar = (assembly in Compile).value
// removing means filtering
val filtered = universalMappings filter
case (file, name) => ! name.endsWith(".jar")
// add the fat jar
filtered :+ (fatJar -> ("lib/" + fatJar.getName))
【讨论】:
【参考方案2】:看来sbt-onejar 插件可能会有所帮助(而不是依赖其他插件 - sbt-assembly 和 sbt-native-packager):
sbt-onejar 是一个简单的构建工具插件,用于构建单个 包含所有代码和依赖项的可执行 JAR 嵌套 JAR。
【讨论】:
我已经更新了问题,说明我需要像 sbt-native-packager 那样生成一个 deb 包。以上是关于如何使用 sbt-assembly 和 sbt-native-packager 构建 deb 包以包含单个程序集 jar?的主要内容,如果未能解决你的问题,请参考以下文章
如何在 sbt-plugin 中使用 sbt-assembly?