如何使用 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-assemblysbt-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 您必须更改 ma​​ppingsscriptClasspath

您的 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?

sbt-assembly:如何在测试期间应用合并策略:组装

抑制 sbt-assembly 中的主类

使用 jars 和 Spark 的 sbt-assembly 行为

sbt-assembly:发现重复数据删除错误

使用 sbt-assembly 来自单个项目的具有不同外部依赖项的多个可执行 jar 文件