leiningen - come aggiungere dipendenze per i jar locali?


117

Voglio usare leiningen per costruire e sviluppare il mio progetto clojure. C'è un modo per modificare project.clj per dirgli di scegliere alcuni barattoli dalle directory locali?

Ho alcuni vasi proprietari che non possono essere caricati in repository pubblici.

Inoltre, può essere usato leiningen per mantenere una directory "lib" per i progetti clojure? Se un gruppo dei miei progetti clojure condividono gli stessi barattoli, non voglio mantenere una copia separata per ciascuno di essi.

Grazie


1
Grazie a tutti. Come è stato sottolineato a tutti, si tratta di una questione spinosa per la quale non è ancora disponibile una risposta chiara.
cercatore di segnali

Risposte:


38

Potresti mettere i tuoi barattoli privati lib/e sarebbero sul percorso di classe per scopi lein swanke simili; questo sembra vanificare il senso dell'utilizzo di uno strumento di gestione delle dipendenze, sebbene se non si desidera effettivamente gestire quelle dipendenze, si potrebbe trattare Leiningen come uno "strumento di gestione delle dipendenze open source" e forse fare attenzione lein clean.

Man mano che la situazione diventa più complessa - è coinvolto un numero maggiore di barattoli privati, si evolvono ed è necessario prendere in considerazione alcune informazioni di controllo delle versioni su di essi - l'idea di Arthur di creare un repository Maven privato potrebbe essere più appropriata.


(Le risorse umane indicano il punto di interruzione della parte specifico di Leiningen ... Continua di seguito per informazioni sulla storia generale degli strumenti di gestione della build / dipendenza nella terra di Clojure, inclusi alcuni collegamenti che penso potrebbero tornare molto utili nella tua situazione.)

Inoltre, per il momento, non esiste ancora un accordo universale sulla questione di quale sia il miglior strumento di costruzione per Clojure, e Leiningen, pur guadagnando in mindshare, guadagna costantemente anche le caratteristiche e la lucidatura delle aree - il che significa, in particolare, che non è ancora completo. Ecco una citazione di Stuart Halloway, l'autore di "Programming Clojure" di Pragmatic Bookshelf: "Il mio 2c: Leiningen è un passo importante, ma c'è ancora molto da fare". Per il post completo e una discussione molto interessante su re: build tools e simili nello spazio Clojure, vedere Leiningen, Clojure e le librerie: cosa mi manca?thread sul gruppo Google Clojure. Molti partecipanti menzionano specificamente la necessità di avere dipendenze locali non contenute in alcun repository, locale o altro, ed elaborano le soluzioni che hanno escogitato per tali scenari. Forse potresti vedere se c'è qualcosa che può risolvere il tuo problema ora / potrebbe risolverlo in futuro, quando i set di funzionalità matureranno?

Ad ogni modo, è possibile che Leiningen non abbia ancora una buona storia pronta per alcuni scenari complessi. Se ritieni che questo possa essere vero per il tuo caso (e intendo dopo aver considerato l'idea del repository privato), ecco alcuni collegamenti ad alternative basate su maven prese dal thread sopra menzionato: polyglot maven , clojure-maven-plugin ; questo post sul blogmira ad essere utile alle persone che cercano di utilizzare Maven con Clojure. Per quanto ricordo, Meikel Brandmeyer (anche lui su SO sotto il suo handle online di kotarak) usa Gradle (un sistema di compilazione Groovy) con un plugin per ospitare Clojure chiamato Clojuresque; Non l'ho mai provato io stesso, poiché non so la prima cosa di Groovy, ma afferma di eseguire un atto di costruzione molto carino con esso e credo che non abbia nulla a che fare con Maven - qualcosa che è un vantaggio in sé e per sé per alcuni di noi. :-)


2
Oggetto: "non esiste un accordo universale sulla questione di quale sia il miglior strumento di build per Clojure" ... Ad oggi, sembrerebbe che Leiningen sia lo standard di fuga. Risultati del sondaggio 2013: lein-survey-2013.herokuapp.com/results
David J.

8
A partire da Leiningen v2, la funzionalità lib / directory è stata rimossa. Vedi: github.com/technomancy/leiningen/wiki/…
Jared314

Ad oggi, Leiningen è probabilmente ancora il più popolare, ma anche Boot è popolare.
Marte

64

Usa semplicemente : resource-path nel tuo file project.clj. Lo uso, ad esempio, per connettermi ai server Siebel. Ho appena creato una directory delle risorse nella directory del mio progetto e ho copiato i file jar al suo interno. Ma ovviamente potresti usare una directory più generica:

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

Quindi dal lein repl posso creare istanze di Siebel Data Bean, ad es

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

Se hai una versione più recente di Java, puoi ovviamente utilizzare i caratteri jolly nella specifica del percorso in questo modo per una directory più generale:

:resource-paths ["/tmp/SiebelJars/*"]

Lein 2 non supporta il globbing, ma il plug-in github.com/dchelimsky/lein-expand-resource-paths è disponibile se necessario.
pondermatic

2
Questa è la migliore risposta che ho visto finora. L'installazione mvn locale non sembra più funzionare per me.
David Williams

7
Questo non funziona con uberjar, poiché uberjar aggiungerà i jar delle dipendenze nel jar, invece di aggiungere i file di classe delle dipendenze.
Tobias Domhan

50
  1. Crea una directory nel progetto:

    mkdir maven_repository

  2. Aggiungi i jar locali a questo repository:

    Ad esempio, questo comando aggiunge il jaad-0.8.3.jarfile al repository 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. Aggiungi quanto segue a project.clj

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

  4. Ora un normale lein depsdovrebbe funzionare:

    $ 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'avviso può essere ignorato, poiché il jar verrà archiviato nel progetto e non scaricato da Internet.

Fonte originale: utilizzo di JAR locali con Leiningen (modificato dopo la copia)


Bei passaggi a questo link. Questo mi è stato molto utile.
goger

2
con le versioni più recenti potresti voler usare mvn deploy: deploy-file invece di install: install-file e specificare -Durl = file: repo invece di -DlocalRepositoryPath = repo. In projects.clj puoi quindi utilizzare:: repository {"local" "file: maven_repository"} Vedi: gist.github.com/stuartsierra/3062743 (Ho modificato la domanda, ma deve ancora essere approvata)
Tobias Domhan

33

Trovo che lein pom; lein jar; lein installfunzioni bene durante lo sviluppo di librerie.

Fallo nella libreria in fase di sviluppo e la tua applicazione che lo richiede lo utilizzerà senza :repositoriesbisogno di pippo.


In alternativa, lein do pom, jar, installè leggermente più conciso.


Ciò consente di chiamare la libreria come qualsiasi altra :dependencies [[project-name "version"]]


3
Rispetto alle altre soluzioni è così semplice e funziona! Non è necessario installare Maven. Grazie.
dkinzer

Come si fa riferimento al jar risultante in un file di progetto lein?
Interstar

Come qualsiasi altro:dependencies [[project-name "version"]]
roboli

1
Funziona benissimo anche su Windows. Non è necessario installare Maven come già accennato. L'ho provato con IntelliJ + Cursive su Windows e funziona perfettamente. "Lein pom; lein jar; lein install" sulla riga di comando di Windows.
avrà inizio l'

4
Hai solo bisogno di fare lein install. Costruirà il barattolo e il pom per te.
neverfox

15

Credo che l'approccio "corretto" sia quello di creare un repository Maven privato in modo da poter memorizzare i vasi in una singola posizione e tutti i tuoi rami ecc. Prenderanno le modifiche. Questo potrebbe essere eccessivo per quello che stai facendo. Sono curioso di sapere se questo è un modo più semplice.


5
Grazie, lo esaminerò. Anche se devo dire che Maven fa paura nel mio cuore. Se conosci qualche semplice esempio passo passo per farlo, per favore indicamelo. Perché le build sono così dannatamente complicate nel mondo Java?
cercatore di segnali



3

Nessuna di queste soluzioni mi ha funzionato. Invece ho installato un repository locale e ho usato Maven per installare il file jar nel repository locale e ho aggiunto il repository locale al mio project.clj

Nella riga di comando:

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

E scrivo il mio project.clj in questo modo:

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

Spero che sia d'aiuto.

[RIFERIMENTO: https://gist.github.com/stuartsierra/3062743 ]


2

Forse dai un'occhiata a questa risposta precedente , fornisco istruzioni passo passo per configurare un repository locale al progetto (accessibile tramite file://) in cui puoi installare i tuoi vasi.



0

L'opzione migliore è configurare un artifactory JFrog / Nexus privato e distribuire lì le tue istantanee / versioni e quindi aggiungere quell'artifiactory come repository nel tuo progetto.clj

Altri modi più semplici sono

HTTP statico Il tipo più semplice di repository privato è un server web puntato su una directory piena di file statici. È possibile utilizzare un file: /// URL nei propri repository: per eseguire la distribuzione in questo modo se la directory è locale sulla macchina su cui Leiningen è in esecuzione.

SCP Se hai già un server configurato con le tue chiavi pubbliche SSH, il trasporto scp è un modo semplice per pubblicare e consumare dipendenze private. Posiziona il seguente all'interno di defproject:

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

Quindi posizionare quanto segue all'esterno del 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 []))))

È anche possibile distribuire in un repository utilizzando il trasporto scp e consumare da esso su http se si configura nginx o qualcosa di simile per servire la directory del repository su HTTP.

NB Le distribuzioni di SCP a Clojars non sono più supportate

La fonte originale è qui https://github.com/technomancy/leiningen/blob/stable/doc/DEPLOY.md

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.