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
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")
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.
Proguard un poco de trabajo, pero también puede usar Proguard desde SBT para crear un JAR independiente.
Hice esto recientemente en la compilación SBT para Scalala .