web-dev-qa-db-fra.com

Comment inclure un fichier JAR externe dans le fichier JAR avec package?

Mon projet dépend d'un pot externe. J'ai créé un répertoire lib et y ai copié le fichier jar. C'est mon build.sbt:

name := "approxstrmatch"

version := "1.0"

scalaVersion := "2.10.4"

unmanagedJars in Compile += file("lib/secondstring-20140729.jar")

libraryDependencies+="org.Apache.spark"%%"spark-core"%"1.0.0"

resolvers += "AkkaRepository" at "http://repo.akka.io/releases/"

Lorsque j'exécute clean et package, le fichier JAR externe n'est pas inclus dans le fichier JAR généré. Pourquoi?

Voici la structure du projet:

project/build.sbt
lib/
src/.....
31
user3803714

Tout d’abord, il n’est pas nécessaire de spécifier explicitement unmanagedJars à moins que votre configuration ne soit plus complexe. Placez simplement vos fichiers JAR dans le répertoire lib et ils seront ajoutés au chemin de classe ( docs ).

Pour conditionner un fichier JAR exécutable avec toutes les dépendances nécessaires, utilisez l’un des plug-ins SBT: sbt-onejar ou sbt-Assembly . package emballe simplement vos classes dans un fichier jar et ne se soucie pas d'inclure des dépendances.

Les instructions dans la documentation des plugins doivent être faciles à vous guider pour les utiliser.

28
yǝsʞǝlA

Essaye ça 

libraryDependencies += "com.acme.common" % "commonclass" % "1.0" from "file:///Users/bwong/git/perf-tools/commonclass/target/scala-2.11/commonclass_2.11-1.0.jar"

Je "paquet sbt" le classproject commun et puis ajoute juste cette dépendance de bibliothèque dans mon build.sbt dans les projets dépendants. 

Merci à http://flummox-engineering.blogspot.com/2014/06/sbt-use-jar-file-for-librarydependencies.html pour ce hack. 

28
Bernie

L'astuce consiste à déterminer le répertoire lib dans lequel placer votre fichier JAR. Pour ce faire, exécutez les opérations suivantes dans votre console sbt: show unmanagedBase

Si vous ne voyez pas votre projet à cet endroit, vous pouvez exécuter show YOURPROJECT/unmanagedBase pour trouver le chemin correct lib.

17
png

Ajoutez cette ligne à votre build.sbt et nettoyez et compilez votre projet.

project/libs, où projet est le répertoire racine de votre projet, placez vos fichiers JAR dans le dossier libs.

unmanagedBase <<= baseDirectory { base => base / "libs" }
3
Sivailango

tl; dr Déplacez project/build.sbt d'un niveau supérieur où se trouve le répertoire lib et utilisez sbt-Assembly plugin (comme décrit dans l'autre réponse de Aleksey ).

Si la disposition du répertoire de projet est identique à celle que vous utilisez pour votre projet, elle est incorrecte car build.sbt n'appartient pas à la même construction que lib.

Puisque sbt est récursif this project/build.sbt décrit la construction du projet qui gouverne celle principale. Citant les docs :

Le répertoire du projet est un autre projet dans votre projet qui sait comment construire votre projet. Le projet à l'intérieur du projet peut (en théorie.) Faire tout ce qu'un projet peut faire. Votre définition de construction est un projet sbt.

Et les tortues descendent complètement. Si vous le souhaitez, vous pouvez modifier le construire la définition du projet de définition de construction, en créant un projet/projet/répertoire.

1
Jacek Laskowski

une des solutions est, lorsque vous construisez ce fichier dans sbt, faites sbt publish-local

1
Vlad Patryshev