leiningen - как добавить зависимости для локальных jar-файлов?

Я хочу использовать leiningen для создания и развития моего проекта clojure. Есть ли способ изменить project.clj, чтобы он выбирал несколько банок из локальных каталогов?

У меня есть проприетарные банки, которые нельзя загрузить в публичные репозитории.

Кроме того, можно ли использовать leiningen для поддержки каталога "lib" для проектов clojure? Если несколько моих проектов clojure используют одни и те же jar-файлы, я не хочу поддерживать отдельную копию для каждого из них.

Спасибо


person signalseeker    schedule 08.03.2010    source источник
comment
Спасибо всем. Как было отмечено всеми, это острый вопрос, на который пока нет четкого ответа.   -  person signalseeker    schedule 16.03.2010


Ответы (11)


Вы можете поместить свои частные jar-файлы в lib/, и они будут в пути к классам для целей lein swank и тому подобного; похоже, что это лишает смысла использование инструмента управления зависимостями, хотя, если вы на самом деле не хотите управлять этими зависимостями, вы можете рассматривать Leiningen как «инструмент управления зависимостями с открытым исходным кодом» и, возможно, будьте осторожны с lein clean.

По мере того, как ситуация становится более сложной - задействовано все больше частных jar-файлов, они развиваются, и вам нужно принимать во внимание некоторую информацию о версиях для них - идея Артура о создании частного репозитория Maven может быть более подходящей.


(HR означает точку отсечения для деталей, специфичных для Leiningen ... Продолжите ниже, чтобы получить информацию об общей истории инструментов управления сборкой / зависимостями в стране Clojure, включая некоторые ссылки, которые, на мой взгляд, могут оказаться очень полезными в вашей ситуации. )

Кроме того, на данный момент нет единого мнения по вопросу о том, какой инструмент для сборки лучше всего подходит для Clojure, и Leiningen, набирая популярность, также постоянно совершенствует свои функции и полировки - в частности, это означает, что это еще не завершено. Вот цитата Стюарта Хэллоуэя, автора книги Pragmatic Bookshelf «Программирование Clojure»: «Мой 2c: Leiningen - важный шаг, но еще многое предстоит сделать». Полную публикацию и очень интересное обсуждение инструментов re: build и т.п. в пространстве Clojure см. В Leiningen, Clojure и библиотеки: что мне не хватает? в группе Clojure Google. Многие участники специально упоминают о необходимости иметь локальные зависимости, не содержащиеся в каких-либо репозиториях, локальных или иных, и подробно рассказывают о решениях, которые они придумали для таких сценариев. Возможно, вы могли бы увидеть, есть ли что-нибудь, что могло бы решить вашу проблему сейчас / могло бы решить ее в будущем, когда наборы функций созреют?

В любом случае, возможно, что у Лейнингена еще нет хорошей истории для некоторых сложных сценариев. Если вы считаете, что это может быть правдой в вашем случае (и я имею в виду после того, как вы рассмотрите идею частного репо), вот несколько ссылок на альтернативы на основе maven, взятые из вышеупомянутого потока: polyglot maven, clojure-maven-plugin < / а>; это сообщение в блоге направлено на то, чтобы быть полезным для людей, пытающихся использовать maven с Clojure. Насколько я помню, Мейкель Брандмайер (также на SO под своим онлайн-дескриптором kotarak) использует Gradle (систему сборки Groovy) с подключаемым модулем Clojuresque для размещения Clojure; Я сам никогда не пробовал, так как ничего не знаю о Groovy, но он утверждает, что провел с ним очень хорошую сборку, и я считаю, что это не имеет ничего общего с maven - что само по себе является плюсом для некоторых из нас. :-)

person Michał Marczyk    schedule 08.03.2010
comment
Re: нет единого мнения по вопросу о том, какой инструмент для сборки лучше всего подходит для Clojure ... На сегодняшний день кажется, что Leiningen - это беглый стандарт. Результаты опроса 2013 года: lein-survey-2013.herokuapp.com/results - person David J.; 15.07.2013
comment
Начиная с Leiningen v2, функциональность lib / directory была удалена. См .: github.com/technomancy/leiningen/wiki/ - person Jared314; 29.10.2013
comment
На сегодняшний день Leiningen, вероятно, по-прежнему самый популярный, но Boot также популярен. - person Mars; 30.11.2016

Просто используйте : resource-paths в файле project.clj. Я использую это, например для подключения к серверам Siebel. Просто создал каталог resources в каталоге моего проекта и скопировал туда файлы jar. Но, конечно, вы можете использовать более общий каталог:

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

Затем из lein repl я могу создать экземпляры Siebel Data Bean, например

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

Если у вас более новая версия Java, вы, конечно, можете использовать подстановочные знаки в своей спецификации пути, например, для более общего каталога:

:resource-paths ["/tmp/SiebelJars/*"]
person Hans-J.    schedule 28.12.2012
comment
Lein 2 не поддерживает глобализацию, но github.com/dchelimsky/lein-expand- при необходимости доступен плагин resource-paths. - person pondermatic; 13.09.2013
comment
Это лучший ответ, который я когда-либо видел. Локальная установка mvn больше не работает для меня. - person David Williams; 30.09.2014
comment
Это не работает с uberjar, поскольку uberjar будет добавлять jar-файлы зависимостей в jar вместо добавления файлов классов зависимостей. - person Tobias Domhan; 18.02.2015

  1. Создайте каталог в проекте:

    mkdir maven_repository

  2. Добавьте локальные банки в этот репозиторий:

    Например, эта команда добавляет файл jaad-0.8.3.jar в репозиторий 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. Добавьте следующее в project.clj

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

  4. Теперь должен работать штатный lein deps:

    $ 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

Предупреждение можно проигнорировать, так как jar будет зарегистрирован в проекте, а не загружен из Интернета.

Исходный источник: Использование локальных JAR с Leiningen (изменено с момента копирования)

person Janus Troelsen    schedule 28.03.2012
comment
Хорошие шаги по этой ссылке. Это мне очень помогло. - person goger; 14.05.2012
comment
с более новыми версиями вы можете использовать mvn deploy: deploy-file вместо install: install-file и указать -Durl = file: repo вместо -DlocalRepositoryPath = repo. Затем в projects.clj вы можете использовать:: repositories {local file: maven_repository} См. gist.github.com / stuartsierra / 3062743 (вопрос редактировал, но все еще требует утверждения) - person Tobias Domhan; 18.02.2015

Я считаю, что «правильный» подход - это создать частный репозиторий Maven чтобы вы могли хранить банки в одном месте, и все ваши ветки и т. д. принимали изменения. Это может быть излишним для того, что вы делаете. Мне любопытно, проще ли это.

person Arthur Ulfeldt    schedule 08.03.2010
comment
Спасибо, я разберусь. Хотя должен сказать, что maven вселяет страх в мое сердце. Если вы знаете какие-либо простые пошаговые примеры для этого, укажите мне, пожалуйста, на них. Почему сборки в мире Java такие чертовски сложные? - person signalseeker; 09.03.2010

Вы можете использовать плагин lein-localrepo: https://github.com/kumarshantanu/lein-localrepo

person Shantanu Kumar    schedule 06.05.2012

Недавняя разработка - это s3-wagon-private плагин Фила для Leiningen: https://github.com/technomancy/s3-wagon-private

Это должно позволить вам публиковать артефакты в частном удаленном репо.

person treat your mods well    schedule 28.01.2012

Ни одно из этих решений у меня не помогло. Вместо этого я установил локальный репозиторий и использовал maven для установки файла jar в локальном репо и добавил локальное репо в свой проект .clj

В командной строке:

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

И я пишу свой project.clj так:

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

Надеюсь, это поможет.

[ССЫЛКА: https://gist.github.com/stuartsierra/3062743]

person Roozbeh Zabihollahi    schedule 21.11.2014

Возможно, взгляните на этот предыдущий ответ я предоставляю пошаговые инструкции по настройке локального репозитория проекта (доступ к которому осуществляется через file://), в который вы можете установить свои jar-файлы.

person Pascal Thivent    schedule 08.03.2010

Попробуйте мое решение, как создать файл jar с зависимостями http://middlesphere-1.blogspot.ru/2014/06/how-to-make-jar-with-dependencies-using.html

person mike    schedule 17.06.2014

Лучший вариант - настроить частный артефакт JFrog / Nexus и развернуть там свои снимки / выпуски, а затем добавить этот артефактор в качестве репозиториев в свой project.clj

Другие более простые способы:

Статический HTTP. Простейший вид частного репозитория - это веб-сервер, указывающий на каталог, полный статических файлов. Вы можете использовать URL-адрес file: /// в ваших репозиториях: для развертывания таким образом, если каталог является локальным по отношению к машине, на которой работает Leiningen.

SCP. Если у вас уже есть сервер, настроенный с вашими открытыми ключами SSH, транспорт scp - это простой способ публикации и использования частных зависимостей. Поместите в defproject следующее:

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

Затем поместите следующее за пределами 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 []))))

Также возможно развернуть в репозиторий с помощью транспорта scp и использовать его через http, если вы настроили nginx или что-то подобное для обслуживания каталога репозитория через HTTP.

N.B. Развертывание SCP в Clojars больше не поддерживается

Первоисточник находится здесь https://github.com/technomancy/leiningen/blob/stable/doc/DEPLOY.md

person Robin    schedule 12.02.2018

person    schedule
comment
По сравнению с другими решениями это так просто и работает! Не нужно устанавливать maven. Спасибо. - person dkinzer; 28.07.2013
comment
Как вы ссылаетесь на полученный jar-файл в файле проекта lein? - person interstar; 04.09.2014
comment
Как и любой другой :dependencies [[project-name "version"]] - person roboli; 04.09.2014
comment
Это также отлично работает в Windows. Как уже упоминалось, устанавливать maven не нужно. Я пробовал использовать IntelliJ + Cursive в Windows, и он отлично работает. Сделал lein pom; lein jar; lein установить из командной строки Windows. - person endbegin; 11.04.2016
comment
В этом сообщении блога описано, как это сделать: spacjer.com/blog/2015/03/23/ - person Tyler; 04.04.2017
comment
Вам нужно сделать только lein install. Он построит для вас банку и помпон. - person neverfox; 25.10.2017