使用sbt Debian插件打包Debian包时,如何指定fat jar源目录?
解决sbt-native-packager Debian打包时找不到正确fat jar路径的问题
我之前也碰到过类似的情况,sbt-native-packager的Debian插件默认的文件查找逻辑有时候会和我们的fat jar生成路径不匹配。针对你的问题,有几种有效的配置方式来指定Debian打包时的源jar路径:
方法一:直接配置Debian映射(Mappings)
最直接的方式是通过mappings in Debian明确指定要打包的fat jar及其在Debian包中的目标路径。假设你用sbt-assembly生成fat jar,在build.sbt中添加以下配置:
lazy val root = (project in file(".")) .enablePlugins(DebianPlugin, AssemblyPlugin) // 务必启用Assembly插件 .settings( // ... 你的其他项目配置(name、version、mainClass等) ... // 指定Debian打包时使用的fat jar mappings in Debian ++= { // 获取assembly生成的fat jar文件 val fatJar = (assembly in Compile).value // 将fat jar映射到Debian包中的标准路径(/usr/share/项目名/下) Seq(fatJar -> s"/usr/share/${name.value}/${fatJar.getName}") }, // 确保Debian打包任务依赖于assembly任务,先生成fat jar再执行打包 packageBin in Debian := (packageBin in Debian).dependsOn(assembly in Compile).value )
这个配置会把sbt-assembly生成的fat jar添加到Debian包的映射中,同时保证打包流程先完成fat jar的生成。
方法二:覆盖默认映射(替换默认jar)
如果默认的Debian映射中已经包含了普通jar文件,你可以先过滤掉这些默认jar,再添加你的fat jar:
mappings in Debian := { val fatJar = (assembly in Compile).value // 过滤掉默认的jar文件 val defaultMappings = (mappings in Debian).value.filterNot { case (_, path) => path.endsWith(".jar") } // 添加fat jar到映射列表 defaultMappings :+ (fatJar -> s"/usr/share/${name.value}/${fatJar.getName}") }
方法三:调整插件的默认jar查找路径
另一种方式是修改Debian插件使用的packageBin任务的源,让它指向你的fat jar路径:
// 让Debian插件的packageBin任务使用assembly生成的jar packageBin in Debian := { val fatJar = (assembly in Compile).value // 确保Debian插件基于这个fat jar构建包 val originalDebianTask = (packageBin in Debian).dependsOn(assembly in Compile).value originalDebianTask }
关键说明
- 如果你用sbt-assembly生成fat jar,必须启用
AssemblyPlugin,否则assembly任务会不存在。 name.value会自动读取你项目中配置的name值,也可以手动替换成固定的路径字符串。- 配置完成后,直接运行
sbt debian:packageBin即可,插件会正确找到你指定的fat jar路径。
内容的提问来源于stack exchange,提问作者schatter
相关产品推荐
相关产品推荐

