Создание отдельной банки с помощью Simple Build Tool - PullRequest
23 голосов
/ 22 мая 2010

Есть ли способ указать sbt упаковать все необходимые библиотеки (scala-library.jar) в основной пакет, чтобы он был автономным? (Статический?)

Ответы [ 5 ]

14 голосов
/ 22 мая 2010

Редактировать 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)
 }
6 голосов
/ 23 мая 2010

Это займет немного работы, но вы также можете использовать Proguard из SBT для создания автономного JAR-файла.

Я делал это недавно в сборке SBT для Scalala..

0 голосов
/ 04 ноября 2014

Самый простой способ - просто создать банку из командной строки.Если вы не знаете, как это сделать, я настоятельно рекомендую вам это сделать.Автоматизация полезна, но ее гораздо лучше, если вы знаете, что делает автоматизация.

Самый простой способ автоматизировать создание исполняемого фляги - это использовать bash-скрипт или batch-скрипт в windows.1004 * Самый простой способ в sbt - просто добавить необходимые библиотеки Scala в каталоги ресурсов:

unmanagedResourceDirectories in Compile := Seq(file("/sdat/bins/ScalaCurrent/lib/scalaClasses"))

Так что в моей среде ScalaCurrent - это ссылка на текущую библиотеку Scala.2.11.4 на момент написания.Ключевым моментом является то, что я извлекаю библиотеку Scala, но помещаю ее в каталог ScalaClassses.Каждая извлеченная библиотека должна идти в каталог верхнего уровня.

0 голосов
/ 24 сентября 2014

Простейший пример использования sbt-assembly

  1. Создание каталога проекта в директории вашего домашнего проекта с файлом assembly.sbt, включающим

    addSbtPlugin ("com.eed3si9n"% "sbt-assembly"% "0.11.2")

  2. В файле build.sbt

    import AssemblyKeys._ // помещаем это в верхнюю часть файла

    assemblySettings

    jarName + = "Mmyjarnameall.jar"

    libraryDependencies ++ = Seq ("exmpleofmydependency%" mydep "%" 0.1 ")

    mergeStrategy в сборке << = (mergeStrategy в сборке) {(old) =>

    {

    case s if s.endsWith (". Class") => MergeStrategy.last

    case s if s.endsWith ("pom.xml") => MergeStrategy.last

    case s if s.endsWith ("pom.properties") => MergeStrategy.last

    case x => old (x)

    }

    }

0 голосов
/ 04 мая 2011

Работая над тем, что @retronym предлагал выше, я создал простой пример , который создает автономный jar-файл, который включает библиотеки Scala (т.е. scala-library.jar), используя Proguard с sbt.Спасибо, ретроним.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...