Существует ли способ сказать системе онлайн бронирования упаковывать все необходимые библиотеки (scala-library.jar) в основной пакет, таким образом, это автономно? (статичный?)
Изменить 2011:
С тех пор ретроним (который опубликовал ответ на этой странице в 2010 году ) сделал этот sbt-плагин «sbt-onejar» , теперь в его новый адрес на GitHub , с обновленной документацией для SBT 0.12.
Упакует ваш проект с помощью One-JAR ™
onejar-sbt
- это плагин простого инструмента сборки для создания единого исполняемого файла JAR, содержащего весь ваш код и зависимости в виде вложенных файлов JAR.
В настоящее время используется One-JAR версии 0.9.7. Он включен в плагин и не требует отдельной загрузки.
Исходный ответ:
Непосредственно это невозможно без расширения sbt ( настраиваемого действия после модели «пакетного» действия 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)
}
Это займет немного времени, но вы также можете использовать Proguard из SBT для создания отдельного JAR.
Я сделал это недавно в SBT-сборке для Scalala.