leiningen - comment ajouter des dépendances pour les jars locaux?

117

Je souhaite utiliser leiningen pour construire et développer mon projet clojure. Existe-t-il un moyen de modifier project.clj pour lui dire de choisir des fichiers JAR dans les répertoires locaux?

J'ai des fichiers JAR propriétaires qui ne peuvent pas être téléchargés vers des dépôts publics.

Aussi, peut-on utiliser leiningen pour maintenir un répertoire "lib" pour les projets clojure? Si plusieurs de mes projets clojure partagent les mêmes pots, je ne veux pas conserver une copie séparée pour chacun d'eux.

Merci

chercheur de signaux
la source
1
Merci tout le monde. Comme il a été souligné à tout le monde, c'est une question épineuse pour laquelle aucune réponse claire n'est encore disponible.
signalseeker

Réponses:

38

Vous pourriez mettre vos pots privés lib/et ils seraient sur le chemin de classe pour les besoins lein swanket autres; cela semble aller à l'encontre de l'intérêt d'utiliser un outil de gestion des dépendances, bien que si vous ne voulez pas vraiment que ces dépendances soient gérées, vous pouvez traiter Leiningen comme un "outil de gestion des dépendances open source" et peut-être faire attention avec lein clean.

Au fur et à mesure que la situation devient plus complexe - il y a un plus grand nombre de jars privés impliqués, ils évoluent et vous devez prendre en compte certaines informations de contrôle de version - l'idée d'Arthur de créer un dépôt Maven privé peut être plus appropriée.


(Le HR signifie le point de coupure de la pièce spécifique à Leiningen ... Continuez ci-dessous pour obtenir des informations sur l'histoire générale de l'outillage de gestion de construction / dépendance dans Clojure land, y compris certains liens qui, je pense, pourraient être très utiles dans votre situation.)

De plus, pour l'instant, il n'y a pas d'accord universel sur la question de savoir quel est le meilleur outil de construction pour Clojure, et Leiningen, tout en gagnant en conscience, gagne également constamment dans les domaines des caractéristiques et du polissage - ce qui signifie, en particulier, que ce n'est pas encore terminé. Voici une citation de Stuart Halloway, l'auteur de "Programming Clojure" de Pragmatic Bookshelf: "Mon 2c: Leiningen est une étape importante, mais il reste encore beaucoup à faire." Pour la publication complète et une discussion très intéressante sur les outils de construction et autres dans l'espace Clojure, voir Leiningen, Clojure et les bibliothèques: que me manque-t-il?fil sur le groupe Google Clojure. De nombreux participants mentionnent spécifiquement la nécessité d'avoir des dépendances locales qui ne sont contenues dans aucun référentiel, local ou autre, et élaborent sur les solutions qu'ils ont proposées pour de tels scénarios. Peut-être pourriez-vous voir s'il y a quelque chose là-bas qui peut résoudre votre problème maintenant / pourrait le résoudre à l'avenir, lorsque les ensembles de fonctionnalités arriveront à maturité?

Quoi qu'il en soit, il est possible que Leiningen n'ait pas encore une bonne histoire prête pour certains scénarios complexes. Si vous pensez que cela peut être vrai dans votre cas (et je veux dire après avoir considéré l'idée du repo privé), voici quelques liens vers des alternatives basées sur maven tirées du fil mentionné ci-dessus: polyglot maven , clojure-maven-plugin ; cet article de blogvise à être utile aux personnes essayant d'utiliser maven avec Clojure. Si je me souviens bien, Meikel Brandmeyer (également sur SO sous son pseudo en ligne de kotarak) utilise Gradle (un système de construction Groovy) avec un plugin pour accueillir Clojure appelé Clojuresque; Je ne l'ai jamais essayé moi-même, car je ne sais pas la première chose à propos de Groovy, mais il prétend diriger un très bel acte de construction avec et je pense que cela n'a rien à voir avec maven - quelque chose qui est un plus en soi pour certains d'entre nous. :-)

Michał Marczyk
la source
2
Re: "il n'y a pas d'accord universel sur la question de savoir quel est le meilleur outil de construction pour Clojure" ... A partir d'aujourd'hui, il semblerait que Leiningen soit maintenant la norme de fuite. Résultats de l'enquête 2013: lein-survey-2013.herokuapp.com/results
David J.
8
Depuis Leiningen v2, la fonctionnalité lib / directory a été supprimée. Voir: github.com/technomancy/leiningen/wiki/…
Jared314
À ce jour, Leiningen est probablement toujours le plus populaire, mais Boot est également populaire.
Mars
64

Utilisez simplement : resource-path dans votre fichier project.clj. Je l'utilise, par exemple pour me connecter aux serveurs Siebel. Je viens de créer un répertoire de ressources dans mon répertoire de projet et d'y copier les fichiers jar. Mais bien sûr, vous pouvez utiliser un répertoire plus générique:

(defproject test-project "0.1.0-SNAPSHOT"
:description "Blah blah blah"
...
:resource-paths ["resources/Siebel.jar" "resources/SiebelJI_enu.jar"])

Ensuite, à partir du lein repl, je peux créer des instances Siebel Data Bean, par exemple

(def sbl (com.siebel.data.SiebelDataBean.))
(.login sbl "siebelServer" "user" "password")
...

Si vous avez une version plus récente de Java, vous pouvez bien sûr utiliser des caractères génériques dans votre spécification de chemin comme ceci pour un répertoire plus général:

:resource-paths ["/tmp/SiebelJars/*"]
Hans-J.
la source
Lein 2 ne prend pas en charge le globbing, mais le plugin github.com/dchelimsky/lein-expand-resource-paths est disponible si vous en avez besoin.
pondermatique du
2
C'est la meilleure réponse que j'ai vue jusqu'à présent. L'installation mvn locale ne semble plus fonctionner pour moi.
David Williams
7
Cela ne fonctionne pas avec uberjar, car uberjar ajoutera les fichiers JAR de dépendances dans le fichier jar, au lieu d'ajouter les fichiers de classe de dépendances.
Tobias Domhan
50
  1. Créez un répertoire dans le projet:

    mkdir maven_repository

  2. Ajoutez des fichiers JAR locaux à ce référentiel:

    Par exemple, cette commande ajoute le jaad-0.8.3.jarfichier au référentiel maven:

    mvn deploy:deploy-file -Dfile=jaad-0.8.3.jar -DartifactId=jaad -Dversion=0.8.3 -DgroupId=jaad -Dpackaging=jar -Durl=file:maven_repository

  3. Ajoutez ce qui suit à project.clj

    :repositories {"local" "file:maven_repository"}

  4. Maintenant, un habitué lein depsdevrait fonctionner:

    $ lein deps Downloading: jaad/jaad/0.8.3/jaad-0.8.3.pom from local Transferring 0K from local [WARNING] *** CHECKSUM FAILED - Error retrieving checksum file for jaad/jaad/0.8.3/jaad-0.8.3.pom - IGNORING

L'avertissement peut être ignoré, car le fichier jar sera archivé dans le projet et non téléchargé depuis Internet.

Source originale: Utilisation de JAR locaux avec Leiningen (modifié depuis la copie)

Janus Troelsen
la source
Belles étapes à ce lien. Cela m'a été très utile.
goger
2
avec les versions plus récentes, vous souhaiterez peut-être utiliser mvn deploy: deploy-file au lieu de install: install-file et spécifier -Durl = file: repo au lieu de -DlocalRepositoryPath = repo. Dans projects.clj, vous pouvez ensuite utiliser:: repositories {"local" "file: maven_repository"} Voir: gist.github.com/stuartsierra/3062743 (j'ai édité la question, mais doit encore être approuvé)
Tobias Domhan
33

Je trouve que cela lein pom; lein jar; lein installfonctionne bien lors du développement de bibliothèques.

Faites cela dans la bibliothèque en cours de développement et votre application qui en a besoin l'utilisera sans :repositoriesfoo requis.


Alternativement, lein do pom, jar, installest légèrement plus concis.


Cela permet d'appeler la bibliothèque comme n'importe quelle autre :dependencies [[project-name "version"]]

Greg B
la source
3
Comparé aux autres solutions, c'est tellement simple et ça marche! Pas besoin d'installer maven. Merci.
dkinzer
Comment référencer le fichier jar résultant dans un fichier de projet lein?
interstar le
Comme tout autre:dependencies [[project-name "version"]]
roboli
1
Cela fonctionne également très bien sur Windows. Pas besoin d'installer maven comme cela a déjà été mentionné. Je l'ai essayé avec IntelliJ + Cursive sous Windows et cela fonctionne parfaitement. A fait un "lein pom; lein jar; lein install" sur la ligne de commande Windows.
endbegin le
4
Vous n'avez qu'à faire lein install. Il construira le pot et le pom pour vous.
Neverfox
15

Je crois que l'approche "correcte" est de créer un référentiel Maven privé afin que vous puissiez stocker les fichiers JAR dans un seul emplacement et que toutes vos branches, etc., prendront en charge les modifications. Cela peut être exagéré pour ce que vous faites. Je suis curieux de savoir si c'est un moyen plus simple.

Arthur Ulfeldt
la source
5
Merci, je vais l'examiner. Même si je dois dire que le maven fait peur dans mon cœur. Si vous connaissez des exemples simples, étape par étape, pour ce faire, indiquez-moi s'il vous plaît. Pourquoi les builds sont-ils si compliqués dans le monde Java?
signalseeker
3

Aucune de ces solutions ne m'a fonctionné. Au lieu de cela, j'ai installé un référentiel local et utilisé maven pour installer le fichier jar dans le référentiel local, et ajouté le référentiel local à mon project.clj

En ligne de commande:

mvn deploy:deploy-file -DgroupId=local -DartifactId=bar \
    -Dversion=1.0.0 -Dpackaging=jar -Dfile=bar.jar \
    -Durl=file:repo

Et j'écris mon project.clj comme ceci:

(defproject foo "0.1.0-SNAPSHOT"
  :dependencies [[org.clojure/clojure "1.4.0"]
                 [local/bar "1.0.0"]]
  :repositories {"project" "file:repo"})

J'espère que ça aide.

[RÉFÉRENCE: https://gist.github.com/stuartsierra/3062743 ]

Roozbeh Zabihollahi
la source
2

Jetez peut-être un œil à cette réponse précédente , je vous donne des instructions étape par étape pour configurer un référentiel local au projet (accessible via file://) dans lequel vous pouvez installer vos jars.

Pascal Thivent
la source
0

La meilleure option consiste à configurer un artificiel JFrog / Nexus privé et à y déployer vos instantanés / versions, puis à ajouter cet artificiel en tant que référentiels dans votre projet.clj

D'autres moyens plus simples sont

HTTP statique Le type le plus simple de référentiel privé est un serveur Web pointé vers un répertoire rempli de fichiers statiques. Vous pouvez utiliser une URL file: /// dans vos: référentiels pour déployer de cette façon si le répertoire est local sur la machine sur laquelle Leiningen est en cours d'exécution.

SCP Si vous avez déjà configuré un serveur avec vos clés publiques SSH, le transport scp est un moyen simple de publier et de consommer des dépendances privées. Placez les éléments suivants à l'intérieur de defproject:

:plugins [[org.apache.maven.wagon/wagon-ssh-external "2.6"]]
:repositories [["releases" "scp://somerepo.com/home/repo/"]]

Placez ensuite les éléments suivants en dehors du defproject:

(cemerick.pomegranate.aether/register-wagon-factory!
 "scp" #(let [c (resolve 'org.apache.maven.wagon.providers.ssh.external.ScpExternalWagon)]
          (clojure.lang.Reflector/invokeConstructor c (into-array []))))

Il est également possible de déployer vers un référentiel en utilisant le transport scp et de consommer à partir de celui-ci via http si vous configurez nginx ou quelque chose de similaire pour servir le répertoire du référentiel via HTTP.

NB Les déploiements de SCP sur Clojars ne sont plus pris en charge

La source originale est ici https://github.com/technomancy/leiningen/blob/stable/doc/DEPLOY.md

Robin
la source