Подтвердить что ты не робот

Создание автономной банки с помощью Simple Build Tool

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

4b9b3361

Ответ 1

Изменить 2011:
С тех пор retronym (который отправил ответ на этой странице в 2010 году), сделал это sbt-plugin "sbt-onejar" , теперь в новый адрес в GitHub, с обновленными документами для SBT 0.12.

Упаковывает ваш проект с помощью One-JAR ™

onejar-sbt - плагин простой сборки для создания единого исполняемого JAR, содержащего весь ваш код и зависимости в виде вложенных JAR.
В настоящее время используется одноранговая версия 0.9.7. Это включено в плагин, и его не нужно отдельно загружать.


Оригинальный ответ:

Непосредственно, это невозможно без расширения sbt (a пользовательского действия после модели "пакет" sbt action).

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)
 }

Ответ 2

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

Я сделал это недавно в SBT build для Scalala.

Ответ 3

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

Ответ 4

Самый простой пример: sbt-assembly

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

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

  • В файле build.sbt

    import AssemblyKeys._//поместите это в начало файла

    assemblySettings

    jarName + = "Mmyjarnameall.jar"

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

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

    {

    case s, если s.endsWith( ". class" ) = > MergeStrategy.last

    case s, если s.endsWith( "pom.xml" ) = > MergeStrategy.last

    case s, если s.endsWith( "pom.properties" ) = > MergeStrategy.last

    case x = > old (x)

    }

    }

Ответ 5

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

Самый простой способ автоматизировать создание runnable jar - использовать bash script или пакетный script в Windows.

Самый простой способ в sbt - просто добавить библиотеки Scala в каталоги ресурсов:

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

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