如何使用sbt和sbt-release发布一个包含依赖项的fat JAR?

15
我需要构建一个包含依赖项的单个jar文件,用作我的一个子项目的javaagent
我有一个多模块sbt项目,这个特定的模块是最底层的一个(它也是纯Java)。
我是否可以(例如使用sbt-onejarsbt-proguardsbt assembly)覆盖最底层模块的打包方式?
看起来这些工具真正的设计目的是作为发布后的步骤,但我确实需要一个(替代或附加的)已发布的产物来包含依赖项(但仅针对此模块)。
更新:Publishing for sbt-assembly提供了单个项目的说明,不太容易转换成多项目。
1个回答

20
使用sbt-assembly发布说明只适用于单个项目,不容易转换为多项目。人们一直在使用sbt-assembly和sbt-release发布fat JAR,没有出现问题。这是一篇来自2011年的博客文章:Publishing fat jar created by sbt-assembly。其要点是在你的build.sbt中添加addArtifact(Artifact(projectName, "assembly"), sbtassembly.AssemblyKeys.assembly),(注意该博客略有过时,AssemblyKeys现在直接是sbtassembly的成员)。对于0.13及以上版本的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: _*)

请参见定义自定义构件

addArtifact 返回一个设置序列(包含在 SettingsDefinition 中)。在完整的构建配置中,使用如下:

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

谢谢,但如果我在build.scala中这样做会出现编译错误。 - fommil
2
“编译错误” — 什么样的编译错误?如果我们既看不到您的代码,也看不到错误信息,就无法提供帮助。 - Seth Tisue
1
谢谢 Eugene,你的修改解决了这个问题(注意:我们在其他地方讨论过,结果是文档中有一个错别字)。 - fommil
我的似乎正在创建程序集,但是发布的是打包好的jar文件,而不是程序集jar文件。你知道问题可能出在哪里吗? - nickn
@nickn 听起来你没有为已组装的 jar 设置分类器,因此它默认为普通的 artifact 名称,然后与先制作/发布的非组装 jar 冲突。 - EdgeCaseBerg

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接