www org scala sbt

scala - org - Hacer un frasco independiente con la herramienta de construcción simple



scala sbt install windows (5)

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

Empaqueta tu proyecto utilizando One-JAR™

onejar-sbt es un complemento de herramienta de compilación simple para crear un solo archivo JAR ejecutable que contiene todos sus códigos y dependencias como archivos JAR anidados.
Actualmente se utiliza la versión 0.9.7 de One-JAR. Esto se incluye con el complemento 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 "package" sbt ).

GitHub menciona una tarea de ensamblaje , hecha a medida para la implementación de embarcadero. Aunque podrías adaptarlo a tu necesidad.

El código es bastante genérico (de este post , y del 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) }

¿Hay alguna manera de decirle a sbt que empaque todas las bibliotecas necesarias (scala-library.jar) en el paquete principal, para que sea independiente? (¿estático?)


El ejemplo más simple usando sbt-assembly

  1. Cree un proyecto de directorio en el directorio de su proyecto de inicio con el archivo assembly.sbt incluido

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

  2. En el archivo build.sbt

    importar AssemblyKeys._ // ponga esto en la parte superior del archivo

    montajeAjustes

    jarName + = "Mmyjarnameall.jar"

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

    mergeStrategy en el ensamblado << = (mergeStrategy en el ensamblaje) {(antiguo) =>

    {

    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

    caso x => viejo (x)

    }

    }


El método más simple es crear el jar desde la línea de comandos. Si no sabes cómo hacerlo, 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 sencilla de automatizar la creación de un archivo 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 actual de Scala. 2.11.4 en el momento de la escritura. El punto clave es que extraigo la biblioteca de Scala pero la coloco dentro de un directorio de ScalaClassses. Cada biblioteca extraída debe ir a su directorio de nivel superior.


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