Crear jar independiente usando SBT


Yo era un usuario de Maven pesado y ahora estoy usando gradualmente SBT para algunos de mis proyectos.

Me gustaría saber cómo puedo usar SBT para crear un proyecto Java independiente? Este proyecto debería ser empaquetado como un archivo JAR y este archivo JAR sería usado como una dependencia en otro proyecto SBT.

En Maven, podría decir en mi pom.xml qué tipo de artefacto debería producir cuando lo construyo. ¿Hay algo similar que pueda hacer en SBT?

 45
Author: Yves M., 2014-01-05

5 answers

Hay una diferencia entre hacer un proyecto independiente y hacer un proyecto utilizable como una dependencia u otro proyecto. En el primer caso, utilizarías un plugin como sbt-assembly . Lo que hará es crear un archivo jar que contenga los archivos de clase del proyecto junto con todas sus dependencias. Si escribes una aplicación, lo que obtienes es un jar con doble clic que puedes ejecutar desde cualquier lugar.

Si desea utilizar su proyecto A como una dependencia para otro proyecto B, tienes diferentes opciones. Simplemente podría empaquetar los archivos de clase de A, usando sbt package (respuesta de @Channing Walton). Entonces podría soltar el archivo .jar resultante en el directorio lib del proyecto B. Sin embargo, si A también requiere bibliotecas, debe asegurarse de que también terminen en las bibliotecas del proyecto B.

Un mejor enfoque es publicar su proyecto. Puede hacerlo únicamente en su máquina local, utilizando sbt publish-local. Que almacenará el frasco como producido por package en un especial directorio local al que se puede acceder desde sbt en otro proyecto, junto con un archivo POM que contiene las dependencias de A. Utilizará un ID de grupo (organización) y un ID de artefacto (nombre) y una versión de su proyecto A. Por ejemplo, en build.sbt:

name              := "projecta"

version           := "0.1.0-SNAPSHOT"

organization      := "com.github.myname"

scalaVersion      := "2.10.3"

publishMavenStyle := true

Después de publicar con sbt publish-local, puede agregar la siguiente dependencia a su proyecto B:

libraryDependencies += "com.github.myname" %% "projecta" % "0.1.0-SNAPSHOT"

Si tiene un proyecto Java puro, puede omitir el sufijo de la versión de Scala, es decir, en el Proyecto A:

crossPaths       := false

autoScalaLibrary := false

Y luego en el Proyecto B:

libraryDependencies += "com.github.myname" % "projecta" % "0.1.0-SNAPSHOT"

(usando solo un carácter % entre el ID del grupo y el artefacto).

Más sobre la publicación en la documentación de sbt .

 71
Author: 0__,
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-25 00:00:58

'sbt package' producirá un archivo jar.

Si desea que sea ejecutable, debe agregar lo siguiente a su .sbt config:

mainClass in Compile := Some("your.main.Class")
 30
Author: Channing Walton,
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
2015-07-23 21:46:29

Claro, puede usar el comando 'sbt package', crea un archivo jar pero este jar estará sin ninguna dependencia. Para ejecutarlo es necesario especificar' classpath ' arg en las bibliotecas.

En su caso desea un archivo ejecutable independiente. Y necesitas agregar las dependencias. Para hacer esto, puede usar el complemento' assembly ' para SBT, consulte https://github.com/sbt/sbt-assembly /

Después puede ejecutar el comando' sbt assembly', proporciona un archivo fat jar con todas las dependencias que puede implementar y ejecutar en cualquier lugar y en cualquier momento.

Para más detalles ver este artículo

 7
Author: maxmalakhov,
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
2015-01-10 20:41:01
publishLocal

Construye el artefacto y lo publica en el repositorio Ivy local haciéndolo disponible para las dependencias de su proyecto local.

publishM2

Igual que el anterior, pero el artefacto se publica en el repositorio Maven local en lugar de Ivy repo.

 4
Author: Marco,
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-01-05 21:08:46

Creo que la forma más fácil de producir un frasco independiente con su proyecto en él, tristemente no está mintiendo dentro de sbt.

Yo personalmente uso mi IDE: Intellij para hacer el tarro (a través de la función 'construir artefacto').

Gracias a Intellij puedo elegir fácilmente qué biblioteca quiero incluir en el jar o no, (por ejemplo, la scala stl).

En mi humilde opinión, este es el método más simple para obtener un jar ejecutable para su proyecto.

Si pones la scala stl puedes ejecutar tu jar con el comando" java-jar", si no lo hace tiene que ejecutarlo en algún lugar con la versión correcta de scala instalada con"scala".

 2
Author: gwenzek,
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-07-15 13:52:29