Правильный способ сделать это, чтобы использовать один из SBT плагинов для производства банок. Я тестировал как one-jar, так и assembly, и обе имеют поддержку для исключения библиотек из вашей банки. Вы можете добавить настройки к отдельным проектам, чтобы только некоторые из них создавали банки.
Я лично использую сборку, но, как указывает this post, вы столкнетесь с проблемами, если у вас есть совпадающие имена файлов.
Edit:
Для примера выше вы бы добавить следующий импорт в верхнем:
import sbtassembly.Plugin._
import AssemblyKeys._
Вы хотите изменить проект, чтобы выглядеть следующим образом:
lazy val daemon = Project(
id = "Daemon",
base = file("Daemon"),
dependencies = Seq(protocol),
settings = assemblySettings
)
Также вам необходимо добавить следующее к вашему project/plugins.sbt
(для sbt .11):
addSbtPlugin("com.eed3si9n" % "sbt-assembly" % "0.7.3")
resolvers += Resolver.url("sbt-plugin-releases",
new URL("http://scalasbt.artifactoryonline.com/scalasbt/sbt-plugin-releases/"))(Resolver.ivyStylePatterns)
Если вы решите пойти с Assembly, вам, вероятно, потребуется удалить дубликаты файлов. Ниже приведен пример кода сборки для исключения дубликатов файлов log4j.properties в проекте с именем «имя_проекта». Это должно быть добавлено как часть последовательности настроек для проекта. Обратите внимание, что второй сборник является базовой реализацией и требуется.
excludedFiles in assembly := { (bases: Seq[File]) =>
bases.filterNot(_.getAbsolutePath.contains("projectName")) flatMap { base =>
//Exclude all log4j.properties from other peoples jars
((base * "*").get collect {
case f if f.getName.toLowerCase == "log4j.properties" => f
}) ++
//Exclude the license and manifest from the exploded jars
((base/"META-INF" * "*").get collect {
case f if f.getName.toLowerCase == "license" => f
case f if f.getName.toLowerCase == "manifest.mf" => f
})
}
}
Спасибо, что работает нормально. Также нужно было добавить плагин в мои plugins.sbt - вы могли бы добавить это в свой ответ, чтобы помочь другим. Завтра я закрою вопрос. Кажется, единственное, что мне действительно нужно, это добавить параметр mainClass: = Some («com.example.Main») в мой проект, если я сам управляю зависимостями/classpath. - Это было довольно скрыто в документации, или, может быть, я просто слепой :-) – Arve