leiningen - jak dodać zależności dla lokalnych plików jar?

117

Chcę używać leiningen do tworzenia i rozwijania mojego projektu clojure. Czy istnieje sposób na zmodyfikowanie pliku project.clj, aby nakazał mu wybranie kilku plików JAR z lokalnych katalogów?

Mam kilka zastrzeżonych plików jar, których nie można przesłać do publicznych repozytoriów.

Czy można też używać leiningen do utrzymywania katalogu „lib” dla projektów clojure? Jeśli kilka moich projektów clojure korzysta z tych samych słoików, nie chcę utrzymywać osobnej kopii dla każdego z nich.

Dzięki

Signalseeker
źródło
1
Dziękuję wszystkim. Jak wskazano wszystkim, jest to drażliwa kwestia, na którą nie ma jeszcze jasnej odpowiedzi.
szukający sygnału

Odpowiedzi:

38

Mógłbyś włożyć swoje prywatne słoiki lib/i znalazłyby się na ścieżce klas do celów lein swanki tym podobnych; wydaje się, że pokonuje to sens używania narzędzia do zarządzania zależnościami, ale jeśli nie chcesz, aby te zależności były zarządzane, możesz traktować Leiningen jako „narzędzie do zarządzania zależnościami open source” i być może ostrożnielein clean .

Gdy sytuacja staje się bardziej złożona - w grę wchodzi większa liczba prywatnych słoików, ewoluują i musisz wziąć pod uwagę pewne informacje dotyczące wersji - pomysł Arthura na utworzenie prywatnego repozytorium Mavena może być bardziej odpowiedni.


(HR oznacza punkt odcięcia części specyficzny dla Leiningen ... Kontynuuj poniżej, aby uzyskać informacje na temat ogólnej historii narzędzi do zarządzania budową / zależnościami w Clojure land, w tym niektóre linki, które, jak sądzę, mogą się bardzo przydać w twojej sytuacji.)

Na razie nie ma też powszechnej zgody co do tego, które narzędzie do budowania jest najlepsze dla Clojure, a Leiningen, zyskując w myślach, stale zyskuje również w obszarach cechy i polaryzację - co oznacza w szczególności, że nie jest jeszcze zakończona. Oto cytat Stuarta Hallowaya, autora książki Pragmatic Bookshelf's „Programming Clojure”: „My 2c: Leiningen to ważny krok, ale wciąż jest wiele do zrobienia”. Aby zapoznać się z pełnym postem i bardzo interesującą dyskusją dotyczącą narzędzi do budowania i tym podobnych w przestrzeni Clojure, zobacz Leiningen, Clojure i biblioteki: czego mi brakuje?wątek w grupie Clojure Google. Wielu uczestników wyraźnie wspomina o potrzebie posiadania lokalnych zależności, które nie są zawarte w żadnym repozytorium, lokalnym lub innym, i opracowuje rozwiązania, które wymyślili dla takich scenariuszy. Być może zobaczysz, czy jest tam coś, co może rozwiązać Twój problem teraz / może rozwiązać go w przyszłości, gdy zestawy funkcji dojrzeją?

W każdym razie jest możliwe, że Leiningen może nie mieć jeszcze dobrej historii na niektóre złożone scenariusze. Jeśli uważasz, że może to być prawda w Twoim przypadku (i mam na myśli po rozważeniu pomysłu prywatnego repo), oto kilka linków do alternatyw opartych na maven wziętych z wyżej wymienionego wątku: polyglot maven , clojure-maven-plugin ; ten wpis na bloguma być przydatny dla osób próbujących używać maven z Clojure. Jak sobie przypominam, Meikel Brandmeyer (również na SO pod jego internetowym uchwytem kotaraka) używa Gradle (systemu kompilacji Groovy) z wtyczką do obsługi Clojure o nazwie Clojuresque; Sam nigdy tego nie próbowałem, bo nie wiem nic o Groovym, ale twierdzi, że prowadzi z nim bardzo fajny akt budowlany i uważam, że nie ma to nic wspólnego z mavenem - coś, co jest plusem samym w sobie dla niektórych z nas. :-)

Michał Marczyk
źródło
2
Odp .: „nie ma powszechnego porozumienia w kwestii tego, które narzędzie jest najlepszym narzędziem do budowania dla Clojure”… Na dzień dzisiejszy wydaje się, że Leiningen jest obecnie standardem ucieczki. Wyniki ankiety 2013: lein-survey-2013.herokuapp.com/results
David J.
8
Od wersji Leiningen v2, funkcjonalność lib / directory została usunięta. Zobacz: github.com/technomancy/leiningen/wiki/…
Jared314
Na dzień dzisiejszy Leiningen jest prawdopodobnie nadal najpopularniejszym, ale popularnym jest również Boot.
Mars
64

Po prostu użyj : ścieżki zasobów w pliku project.clj. Używam go np. Do łączenia się z serwerami Siebel. Właśnie utworzyłem katalog zasobów w katalogu mojego projektu i skopiowałem tam pliki jar. Ale oczywiście możesz użyć bardziej ogólnego katalogu:

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

Następnie z lein repl mogę tworzyć instancje Siebel Data Bean, np

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

Jeśli masz nowszą wersję Java, możesz oczywiście użyć symboli wieloznacznych w specyfikacji ścieżki, tak jak to jest w przypadku bardziej ogólnego katalogu:

:resource-paths ["/tmp/SiebelJars/*"]
Hans-J.
źródło
Lein 2 nie obsługuje globbingu, ale wtyczka github.com/dchelimsky/lein-expand-resource-paths jest dostępna, jeśli zajdzie taka potrzeba.
pondermatic
2
To najlepsza odpowiedź, jaką do tej pory widziałem. Wydaje się, że lokalna instalacja mvn już nie działa.
David Williams,
7
To nie działa z uberjar, ponieważ uberjar doda pliki JAR zależności w jar, zamiast dodawać pliki klas zależności.
Tobias Domhan
50
  1. Utwórz katalog w projekcie:

    mkdir maven_repository

  2. Dodaj lokalne pliki JAR do tego repozytorium:

    Na przykład to polecenie dodaje jaad-0.8.3.jarplik do repozytorium 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. Dodaj następujące elementy do project.clj

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

  4. Teraz regularny lein depspowinien działać:

    $ 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

Ostrzeżenie można zignorować, ponieważ jar zostanie wpisany do projektu i nie zostanie pobrany z Internetu.

Oryginalne źródło: Korzystanie z lokalnych plików JAR z Leiningen (zmienione od czasu skopiowania)

Janus Troelsen
źródło
Niezłe kroki pod tym linkiem. To było dla mnie bardzo pomocne.
goger
2
w nowszych wersjach możesz chcieć użyć mvn deploy: deploy-file zamiast install: install-file i określić -Durl = file: repo zamiast -DlocalRepositoryPath = repo. W projects.clj możesz następnie użyć:: repositories {"local" "file: maven_repository"} Zobacz: gist.github.com/stuartsierra/3062743 (redagowałem pytanie, ale nadal wymaga zatwierdzenia)
Tobias Domhan
33

znajduję lein pom; lein jar; lein install działa dobrze podczas tworzenia bibliotek.

Zrób to w rozwijanej bibliotece, a aplikacja, która tego wymaga, będzie z niej korzystać bez żadnych :repositoriesfoo.


Ewentualnie lein do pom, jar, installjest nieco bardziej zwięzła.


Pozwala to na wywołanie biblioteki jak każda inna :dependencies [[project-name "version"]]

Greg B.
źródło
3
W porównaniu do innych rozwiązań jest to takie proste i działa! Nie ma potrzeby instalowania mavena. Dzięki.
dkinzer
W jaki sposób odnosisz się do powstałego pliku jar w pliku projektu Lein?
interstar
Jak każdy inny:dependencies [[project-name "version"]]
roboli
1
Działa to również świetnie w systemie Windows. Nie ma potrzeby instalowania mavena, jak już wspomniano. Wypróbowałem to z IntelliJ + Cursive w systemie Windows i działa idealnie. Wykonano polecenie „lein pom; lein jar; lein install” w wierszu poleceń systemu Windows.
koniec rozpoczęcia
4
Musisz tylko zrobić lein install. Zbuduje dla Ciebie słoik i pom.
neverfox
15

Uważam, że „właściwym” podejściem jest utworzenie prywatnego repozytorium Maven, tak aby można było przechowywać słoiki w jednym miejscu, a wszystkie gałęzie itp. Przyjmowały zmiany. To może być przesada za to, co robisz. Ciekaw jestem, czy to łatwiejszy sposób.

Arthur Ulfeldt
źródło
5
Dzięki, przyjrzę się temu. Chociaż muszę powiedzieć, że maven budzi strach w moim sercu. Jeśli znasz jakieś proste przykłady pokazujące krok po kroku, jak to zrobić, wskaż mi to. Dlaczego kompilacje są tak cholernie skomplikowane w świecie Java?
szukający sygnału
3

Żadne z tych rozwiązań nie zadziałało. Zamiast tego zainstalowałem lokalne repozytorium i użyłem maven do zainstalowania pliku jar w lokalnym repozytorium i dodałem lokalne repozytorium do mojego projektu.clj

W linii poleceń:

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

I piszę mój project.clj w ten sposób:

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

Mam nadzieję, że to pomoże.

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

Roozbeh Zabihollahi
źródło
2

Może rzuć okiem na tę poprzednią odpowiedź. Podaję instrukcje krok po kroku, aby skonfigurować repozytorium lokalne dla projektu (dostępne przez file://), w którym można zainstalować swoje słoiki.

Pascal Thivent
źródło
0

Najlepszą opcją jest skonfigurowanie prywatnej artefaktury JFrog / Nexus i wdrożenie tam migawek / wersji, a następnie dodanie tego artefaktora jako repozytoriów w projekcie.clj

Inne prostsze sposoby to

Statyczny HTTP Najprostszym rodzajem prywatnego repozytorium jest serwer WWW wskazujący na katalog pełen plików statycznych. Możesz użyć pliku: /// URL w swoich: repozytoriach, aby wdrożyć w ten sposób, jeśli katalog jest lokalny na komputerze, na którym działa Leiningen.

SCP Jeśli masz już serwer skonfigurowany przy użyciu kluczy publicznych SSH, transport scp jest prostym sposobem publikowania i wykorzystywania prywatnych zależności. Umieść następujące elementy wewnątrz projektu:

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

Następnie umieść następujące elementy poza defprojektem:

(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 []))))

Możliwe jest również wdrożenie do repozytorium przy użyciu transportu scp i korzystanie z niego przez http, jeśli skonfigurujesz nginx lub coś podobnego do obsługi katalogu repozytorium przez HTTP.

Wdrożenia NB SCP w Clojars nie są już obsługiwane

Oryginalne źródło jest tutaj https://github.com/technomancy/leiningen/blob/stable/doc/DEPLOY.md

Rudzik
źródło