Редактировать 2011:
С тех пор retronym (который опубликовал ответ на этой странице еще в 2010 ) сделал этот sbt-плагин "sbt-onejar" , теперь в его новый адрес на GitHub , с документами, обновленными для SBT 0,12.
Пакетирует ваш проект, используя One-JAR ™
onejar-sbt
- это простой плагин для сборки инструментов для создания одного исполняемого JAR-файла, содержащего весь ваш код и зависимости в виде вложенных JAR-файлов.
В настоящее время используется версия One-JAR 0.9.7. Это входит в состав плагина и не требует отдельной загрузки.
Оригинальный ответ:
Напротив, это невозможно без расширения sbt (пользовательское действие после модели действия "package" sbt ).
GitHub упоминает задачу сборки , специально созданную для развертывания причала. Вы можете адаптировать его для своих нужд.
Код довольно общий (с этот пост , и пользователь Rio):
project / build / AssemblyProject.scala
import sbt._
trait AssemblyProject extends BasicScalaProject
{
def assemblyExclude(base: PathFinder) = base / "META-INF" ** "*"
def assemblyOutputPath = outputPath / assemblyJarName
def assemblyJarName = artifactID + "-assembly-" + version + ".jar"
def assemblyTemporaryPath = outputPath / "assembly-libs"
def assemblyClasspath = runClasspath
def assemblyExtraJars = mainDependencies.scalaJars
def assemblyPaths(tempDir: Path, classpath: PathFinder, extraJars: PathFinder, exclude: PathFinder => PathFinder) =
{
val (libs, directories) = classpath.get.toList.partition(ClasspathUtilities.isArchive)
for(jar <- extraJars.get ++ libs) FileUtilities.unzip(jar, tempDir, log).left.foreach(error)
val base = (Path.lazyPathFinder(tempDir :: directories) ##)
(descendents(base, "*") --- exclude(base)).get
}
lazy val assembly = assemblyTask(assemblyTemporaryPath, assemblyClasspath, assemblyExtraJars, assemblyExclude) dependsOn(compile)
def assemblyTask(tempDir: Path, classpath: PathFinder, extraJars: PathFinder, exclude: PathFinder => PathFinder) =
packageTask(Path.lazyPathFinder(assemblyPaths(tempDir, classpath, extraJars, exclude)), assemblyOutputPath, packageOptions)
}