Как опубликовать жир JAR (JAR с зависимостями) с помощью sbt и sbt-release?

Мне нужно создать одну банку, включая зависимости, для одного из моих подпроектов, чтобы ее можно было использовать как javaagent.

У меня есть многомодульный проект sbt, и этот конкретный модуль является самым низким уровнем (он также является чистой Java).

Могу ли я (например, sbt-onejar, sbt-proguard или сборка sbt) переопределяют, как упаковывается модуль нижнего уровня?

Похоже, что эти инструменты действительно предназначены для публикации после публикации, но мне действительно нужен (заменяющий или дополнительный) опубликованный артефакт, чтобы включить зависимости (но только для этого одного модуля).

ОБНОВЛЕНИЕ: Publishing для sbt-assembly - это инструкции для одного проекта и нелегко перевести на несколько проектов.

Ответ 1

Публикация для sbt-assembly - это инструкции для одного проекта и не легко переводится в мультипроект.

Люди публикуют толстый JAR, используя sbt-assembly и sbt-release без проблем. Вот статья блога с 2011 года: Публикация толстой банки, созданная 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: _*)

См. Определение пользовательских артефактов:

addArtifact возвращает последовательность настроек (завернутых в SettingsDefinition). В полной конфигурации сборки использование выглядит следующим образом:

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