Fabricación de tarro independiente con Herramienta de Construcción Simple


Hay una manera de decirle a sbt que empaquete todas las bibliotecas necesarias (scala-library.jar) en el paquete principal, por lo que es independiente? (estática?)

 23
Author: Łukasz Lew, 2010-05-22

5 answers

Editar 2011:
Desde entonces, retronym (que publicó una respuesta en esta página en 2010), hizo que este sbt-plugin "sbt-onejar", ahora en su nueva dirección en GitHub, con documentos actualizados para SBT 0.12.

Empaqueta su proyecto usando One-JAR™

onejar-sbt es un complemento de herramienta de compilación simple para construir un único JAR ejecutable que contiene todo su código y dependencias como JARs anidados.
Actualmente Se utiliza la versión One-JAR 0.9.7. Esto se incluye con el plugin, y no es necesario descargarlo por separado.


Respuesta original:

Directamente, esto no es posible sin extender sbt (una acción personalizada después del modelo de la acción sbt "paquete" ).

GitHub menciona una tarea de ensamblado , hecha a medida para el despliegue de jetty. Sin embargo, puedes adaptarlo a tus necesidades.

El código es bastante genérico (de esto post , y el usuario 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)
 }
 14
Author: VonC,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-05-23 12:00:17

Toma un poco de trabajo, pero también puede usar Proguard desde SBT para crear un JAR independiente.

Hice esto recientemente en la compilación de SBT para Scalala.

 6
Author: retronym,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-05-23 15:37:55

Trabajando fuera de lo que @retronym ofreció anteriormente, construí un ejemplo simple que construye un jar independiente que incluye las bibliotecas Scala (es decir, scala-library.jar) usando Proguard con sbt. Gracias, retronym.

 0
Author: Leif Wickland,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-05-04 03:59:09

El ejemplo más simple usando sbt-assembly

  1. Cree un proyecto de directorio en su directorio de proyecto de inicio con el ensamblado de archivos.sbt incluyendo

    AddSbtPlugin ("com.eed3si9n " % "sbt-ensamblaje" % "0.11.2")

  2. En la compilación de archivos.sbt

    Importar claves ensambladas._ / / ponga esto en la parte superior del archivo

    AssemblySettings

    JarName += "Mmyjarnameall.jar "

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

    MergeStrategy in assembly

    {

    Case s if s. endsWith (".class") = > MergeStrategy.último

    Case s if s. endsWith ("pom.xml") = > MergeStrategy.último

    Case s if s. endsWith ("pom.propiedades") => MergeStrategy.último

    Case x = > old (x)

    }

    }

 0
Author: Arkadiusz Bicz,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-09-24 09:04:12

El método más simple es crear el jar desde la línea de comandos. Si no sabes cómo hacer esto, te recomiendo que lo hagas. La automatización es útil, pero es mucho mejor si sabes lo que está haciendo la automatización.

La forma más fácil de automatizar la creación de un jar ejecutable es usar un script bash o un script por lotes en windows.

La forma más sencilla en sbt es simplemente agregar las bibliotecas de Scala que necesita a los directorios de recursos:

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

Así que en mi entorno ScalaCurrent es un enlace a la biblioteca Scala actual. 2.11.4 en el momento de redactar el presente informe. El punto clave es que extraigo la biblioteca Scala pero la coloco dentro de un directorio ScalaClassses. Cada biblioteca extraída necesita ir a su directorio de nivel superior.

 0
Author: Rich Oliver,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-11-04 02:11:09