sbt-сборка: как связать jar зависимостей с основным jar?

Я пишу в Scala и использую SBT с плагином sbt-assembly. В моем проекте много внешних библиотек, поэтому для упаковки файла JAR sbt-сборка занимает много времени. Я хотел бы иметь отдельные файлы JAR для моего кода и для зависимостей. Поэтому я мог просто перекомпилировать и перепаковать только мой код. Как это сделать?

Прогресс на данный момент:

Следующие команды в build.sbt позволяют sbt-сборке упаковывать библиотеки:

assembleArtifact in packageScala := false

assembleArtifact in packageDependency := false

Затем можно создать отдельные jar файлы, передав следующие команды: assembly, assembly-package-scala и assembly-package-dependency. Они делают три jar файла: один, содержащий мою программу, один с библиотеками scala и один со всеми зависимостями.

Однако файл jar больше не является исполняемым, потому что он не видит зависимости в отдельном файле jar. Я думаю, что мне нужно добавить classpath к Assembly-SBT, но я не уверен, как это сделать.

Ответ 1

Используйте плагин sbt-pack https://github.com/xerial/sbt-pack. До сих пор я нашел его самым чистым способом упаковки проекта и зависимостей.

Ответ 2

См. Настройка Classpath Still Can Can Find External Jar. Oracle говорит:

Когда вы используете этот параметр, JAR файл является источником всех пользовательских классов, а другие параметры пути к пользовательскому классу игнорируются.

Итак, вы должны сказать:

java -cp "foo-assembly-0.1-deps.jar:foo-assembly-0.1.jar" Main

где Main - это имя основного класса, а : - разделитель файлов на вашей ОС (; в Windows).

В настоящее время существует ошибка в assembly-package-scala, и она выводится пустым, но это не имеет значения, потому что assembly-package-dependency также содержит библиотеку Scala.