web-dev-qa-db-fra.com

Créer un pot autonome à l'aide de SBT

J'étais un grand utilisateur de Maven et maintenant j'utilise progressivement SBT pour certains de mes projets.

Je voudrais savoir comment utiliser SBT pour créer un projet autonome Java? Ce projet doit être empaqueté sous forme de fichier JAR et ce fichier JAR sera utilisé comme dépendance dans un autre projet SBT .

À Maven, je pouvais dire dans mon pom.xml quel type d'artefact il devrait produire quand je le construis. Y a-t-il quelque chose de similaire que je peux faire dans SBT?

47
sparkr

Il y a une différence entre autonome et rendre un projet utilisable comme dépendance ou autre projet. Dans le premier cas, vous utiliseriez un plugin tel que sbt-Assembly . Ce qu'il fera, c'est créer un fichier jar contenant les fichiers de classe de projet avec toutes ses dépendances. Si vous écrivez une application, vous obtenez un pot double-cliquable que vous pouvez exécuter de n'importe où.

Si vous souhaitez utiliser votre projet A comme dépendance pour un autre projet B, vous avez différentes options. Vous pouvez simplement empaqueter les fichiers de classe de A, en utilisant sbt package (réponse de @Channing Walton). Vous pouvez ensuite supprimer le .jar fichier dans le répertoire lib du projet B. Cependant, si A nécessite également des bibliothèques, vous devez vous assurer qu'elles se retrouvent également dans les bibliothèques du projet B.

Une meilleure approche consiste à publier votre projet. Vous pouvez le faire uniquement sur votre ordinateur local, en utilisant sbt publish-local. Cela stockera le fichier jar tel que produit par package dans un répertoire local spécial accessible à partir de sbt dans un autre projet, avec un fichier POM qui contient les dépendances de A. Il utilisera un ID de groupe (organisation ) et l'artefact-ID (nom) et une version de votre projet A. Par exemple, dans build.sbt:

name              := "projecta"

version           := "0.1.0-SNAPSHOT"

organization      := "com.github.myname"

scalaVersion      := "2.10.3"

publishMavenStyle := true

Après publication avec sbt publish-local, vous pouvez ajouter la dépendance suivante à votre projet B:

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

Si vous avez un projet Java Java pur, vous pouvez omettre le suffixe de version Scala, c'est-à-dire dans le projet A:

crossPaths       := false

autoScalaLibrary := false

Et puis dans le projet B:

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

(en utilisant un seul % caractère entre le groupe et l'ID d'artefact).

Plus d'informations sur la publication dans la documentation sbt .

74
0__

'package sbt' produira un fichier jar.

Si vous voulez qu'il soit exécutable, vous devez ajouter ce qui suit à votre configuration .sbt:

mainClass in Compile := Some("your.main.Class")
30
Channing Walton

Bien sûr, vous pouvez utiliser la commande 'sbt package', elle crée un fichier jar mais ce jar sera sans aucune dépendance. Pour l'exécuter, il faut spécifier l'argument 'classpath' aux bibliothèques.

Dans votre cas, vous souhaitez un fichier exécutable autonome. Et vous devez ajouter les dépendances. Pour ce faire, vous pouvez utiliser le plugin 'Assembly' pour SBT, voir https://github.com/sbt/sbt-Assembly/

Ensuite, vous pouvez simplement exécuter la commande 'sbt Assembly', elle fournit un fichier jar avec toutes les dépendances que vous pouvez déployer et exécuter n'importe où et à tout moment.

Pour plus de détails, voir ceci article

7
maxmalakhov
publishLocal

construit l'artefact et le publie dans le référentiel Ivy local, le rendant disponible pour les dépendances de votre projet local.

publishM2

comme ci-dessus, mais l'artefact est publié dans le référentiel Maven local au lieu du référentiel Ivy.

4
Marco

Je pense que la façon la plus simple de produire un pot autonome avec votre projet, n'est malheureusement pas à l'intérieur de sbt.

J'utilise personnellement mon IDE: Intellij pour fabriquer le pot (grâce à la fonction 'build artifact').

Grâce à Intellij, je peux facilement choisir la bibliothèque que je souhaite inclure ou non dans le pot (par exemple le scala stl).

À mon humble avis, c'est de loin la méthode la plus simple pour obtenir un pot exécutable pour votre projet.

Si vous mettez la scala stl vous pouvez exécuter votre jar avec la commande "Java -jar", sinon vous devez l'exécuter quelque part avec la version correcte de scala installé avec "scala".

2
gwenzek