如何使用sbt和sbt-release发布胖JAR(具有依赖项的JAR)?

时间:2014-04-14 21:09:24

标签: deployment jar sbt sbt-assembly

我需要为我的一个子项目构建一个jar,包括依赖项,以便它可以用作javaagent

我有一个多模块的sbt项目,这个特定的模块是最低级别的(它也是纯Java)。

我可以(例如sbt-onejarsbt-proguardsbt assembly)覆盖最低级别模块的打包方式吗?

看起来这些工具确实设计为发布后步骤,但我确实需要一个(替换或附加)已发布的工件来包含依赖项(但仅适用于这一个模块)。

更新: Publishing sbt-assembly是单个项目的说明,不容易转换为多项目。

1 个答案:

答案 0 :(得分:18)

  

发布sbt-assembly是单个项目的说明,不容易转换为多项目。

人们一直在使用sbt-assembly& amp; sbt-release没有问题。以下是2011年的博客文章:Publishing fat jar created by sbt-assembly。归结为将addArtifact(Artifact(projectName, "assembly"), sbtassembly.AssemblyKeys.assembly)添加到您的build.sbt(请注意,博客有点过时AssemblyKeys现在已成为sbtassembly的成员。

对于sbt 0.13及以上版本,我更喜欢将build.sbt用于多个项目,所以我会写它:

import AssemblyKeys._

lazy val commonSettings = Seq(
  version := "0.1-SNAPSHOT",
  organization := "com.example",
  scalaVersion := "2.10.1"
)

val app = (project in file("app")).
  settings(commonSettings: _*).
  settings(assemblySettings: _*).
  settings(
    artifact in (Compile, assembly) ~= { art =>
      art.copy(`classifier` = Some("assembly"))
    }
  ).
  settings(addArtifact(artifact in (Compile, assembly), assembly).settings: _*)

请参阅Defining custom artifacts

  

addArtifact返回一系列设置(包含在SettingsDefinition中)。在完整版本配置中,用法如下:

...
lazy val proj = Project(...)
  .settings( addArtifact(...).settings : _* )
...