如何从 sbt 的包中排除程序集?

Posted

技术标签:

【中文标题】如何从 sbt 的包中排除程序集?【英文标题】:How to exclude assembly from package in sbt? 【发布时间】:2014-05-10 23:07:36 【问题描述】:

我有一个 build.scala 文件,其中的部分类似于下面的剪辑。 我使用 sbt-assembly 构建所有依赖库的 jar 文件以进行部署。

这构建得很好。我的问题是我运行“程序集”并构建~16MB core-deps 文件,然后我运行“包”尝试构建 core.jar 文件。它构建了 core.jar——但随后它用一个空文件覆盖了我的 core-deps.jar 文件(因为 core-deps 没有自己的代码)。

我怎样才能同时构建 core.jar 和 core-deps.jar 并且不让“包”吹走 core-deps.jar?

lazy val deps = Project("core-deps", file("."), 
    settings = basicSettings ++ 
                sbtassembly.Plugin.assemblySettings ++ 
                Seq(assemblyOption in assembly ~=  _.copy(includeScala = false) ) ++
                addArtifact(Artifact("core-deps", "core-deps"), sbtassembly.Plugin.AssemblyKeys.assembly) ++    
                Seq(
                    libraryDependencies ++=
                        // Master list of all used libraries so it gets added to the deps.jar file when you run assembly
                        compile(commons_exec, commons_codec, commons_lang, casbah, googleCLHM, joda_time, scalajack, spray_routing, spray_can, spray_client, spray_caching, akka_actor, akka_cluster, akka_slf4j, prettytime, mongo_java, casbah_gridfs, typesafe_config, logback),
                    jarName in assembly <<= (scalaVersion, version) map  (scalaVersion, version) => "core-deps_" + scalaVersion.dropRight(2) + "-" + version + ".jar"  
                )) aggregate(core)

lazy val core = project 
    .settings(basicSettings: _*)
    .settings(buildSettings: _*)
    .settings(libraryDependencies ++=
        compile(commons_exec, prettytime, commons_codec, casbah, googleCLHM, scalajack, casbah_gridfs, typesafe_config, spray_routing, spray_client, spray_can, spray_caching, akka_actor, akka_slf4j, akka_cluster, logback) ++
        test(scalatest, parboiled, spray_client)
    )

【问题讨论】:

【参考方案1】:

为什么不使用 sbt-assembly 自带的assemblyPackageDependency 任务呢?见Excluding Scala library, your project, or deps JARs。

如果出于某种原因您真的想在 core-deps 项目中禁用 package 任务,您可以尝试重新连接 packageBin

packageBin := (outputPath in assembly).value

这只会返回文件名。

【讨论】:

以上是关于如何从 sbt 的包中排除程序集?的主要内容,如果未能解决你的问题,请参考以下文章

SBT中已发布的程序集包中的未解析依赖项

SBT 程序集从另一个 JAR 中删除类

如何从 Maven 程序集插件中排除依赖项:jar-with-dependencies?

如何使用 sbt-assembly 和 sbt-native-packager 构建 deb 包以包含单个程序集 jar?

为啥执行“sbt 程序集”失败并显示“不是有效的命令:程序集”?

设置 sbt 程序集 v0.14.2 的问题