Créer un fichier jar autonome à l’aide de SBT

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

J’aimerais savoir comment utiliser SBT pour créer un projet Java autonome? Ce projet doit être empaqueté en tant que fichier JAR et ce fichier JAR sera utilisé comme dépendance dans un autre projet SBT.

Dans Maven, je pourrais dire dans mon pom.xml quel type d’artefact il devrait produire lorsque je le construis. Y a-t-il quelque chose de similaire que je peux faire dans SBT?

    Il y a une différence entre l’autonomie et la création d’un projet en tant que dépendance ou autre projet. Dans le premier cas, vous utiliseriez un plugin tel que sbt-assembly . Qu’est-ce qu’il va faire est de 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 fichier à double clic sur lequel vous pouvez exécuter n’importe où.

    Si vous voulez 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 le sbt package (réponse de @Channing Walton). Vous pouvez alors déposer le fichier .jar résultant 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 sbt publish-local local, en utilisant sbt publish-local . Cela stockera le fichier jar produit par package dans un répertoire local spécial accessible depuis sbt dans un autre projet, avec un fichier POM contenant les dépendances de A. Il utilisera un identifiant de groupe (organisation) et un identifiant d’artefact. (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 avoir publié avec sbt publish-local , vous pouvez append la dépendance suivante à votre projet B:

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

    Si vous avez un projet 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 seulement un % caractère entre le groupe et l’ID d’artefact).

    Plus d’informations sur la publication dans la documentation de sbt .

    ‘sbt package’ produira un fichier jar.

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

     mainClass in Comstack := Some("your.main.Class") 

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

    Dans votre cas, vous souhaitez un fichier exécutable autonome. Et vous devez append les dépendances. Pour ce faire, vous pouvez utiliser le plug-in ‘assembly’ pour SBT, voir https://github.com/sbt/sbt-assembly/

    Vous pouvez ensuite exécuter la commande ‘sbt assembly’, qui fournit un fichier jar contenant toutes les dépendances que vous pouvez déployer et exécuter n’importe où et à tout moment.

    Pour plus de détails voir cet article

     publishLocal 

    construit l’artefact et le publie dans le référentiel Ivy local pour le rendre disponible pour vos dépendances de projet locales.

     publishM2 

    comme ci-dessus, mais l’artefact est publié dans le repo Maven local au lieu du repo Ivy.

    Je pense que le moyen le plus simple de produire un pot autonome avec votre projet est malheureusement de ne pas le faire.

    Personnellement, j’utilise mon IDE: Intellij pour créer le jar (via la fonctionnalité ‘build artefact’).

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

    IMHO, c’est de loin la méthode la plus simple pour obtenir un fichier exécutable pour votre projet.

    Si vous placez le fichier scala stl, vous pouvez exécuter votre jar avec la commande “java -jar”, si vous ne le faites pas, vous devez l’exécuter quelque part avec la version correcte de scala installée avec “scala”.