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

117

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

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

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

Спасибо

signalseeker
источник
1
Спасибо всем. Как было отмечено всеми, это острый вопрос, на который пока нет четкого ответа.
signalseeker

Ответы:

38

Вы можете поместить свои частные 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 - что само по себе является плюсом для некоторых из нас. :-)

Михал Марчик
источник
2
Касательно: «Нет единого мнения по вопросу о том, какой инструмент для сборки лучше всего подходит для Clojure» ... На сегодняшний день кажется, что Leiningen - это беглый стандарт. Результаты опроса 2013 года: lein-survey-2013.herokuapp.com/results
Дэвид Дж
8
Начиная с Leiningen v2, функциональность lib / directory была удалена. См .: github.com/technomancy/leiningen/wiki/…
Jared314,
На сегодняшний день Leiningen, вероятно, по-прежнему самый популярный, но также популярен Boot.
Марс
64

Просто используйте : resource-paths в вашем файле project.clj. Я использую его, например, для подключения к серверам Siebel. Просто создал каталог ресурсов в каталоге моего проекта и скопировал туда файлы 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/*"]
Hans-J.
источник
Lein 2 не поддерживает подстановку, но при необходимости доступен плагин github.com/dchelimsky/lein-expand-resource-paths .
pondermatic
2
Это лучший ответ, который я когда-либо видел. Локальная установка mvn больше не работает для меня.
Дэвид Уильямс
7
Это не работает с uberjar, поскольку uberjar добавит jar-файлы зависимостей в jar вместо добавления файлов классов зависимостей.
Тобиас Доман
50
  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 (изменено после копирования)

Янус Троельсен
источник
Хорошие шаги по этой ссылке. Это мне очень помогло.
goger
2
с более новыми версиями вы можете использовать mvn deploy: deploy-file вместо install: install-file и указать -Durl = file: repo вместо -DlocalRepositoryPath = repo. Затем в projects.clj вы можете использовать:: repositories {"local" "file: maven_repository"} См.: Gist.github.com/stuartsierra/3062743 (я отредактировал вопрос, но все еще требует утверждения)
Тобиас Доман,
33

Я считаю, что lein pom; lein jar; lein installхорошо работает при разработке библиотек.

Сделайте это в разрабатываемой библиотеке, и ваше приложение, требующее ее, будет использовать ее без необходимости в :repositoriesfoo.


Как вариант, lein do pom, jar, installэто немного более кратко.


Это позволяет вызывать библиотеку как любую другую :dependencies [[project-name "version"]]

Грег Б.
источник
3
По сравнению с другими решениями это так просто и работает! Не нужно устанавливать maven. Спасибо.
dkinzer
Как вы ссылаетесь на полученный jar-файл в файле проекта lein?
Interstar
Как и любой другой:dependencies [[project-name "version"]]
roboli 04
1
Это отлично работает и в Windows. Нет необходимости устанавливать maven, как уже упоминалось. Я пробовал использовать IntelliJ + Cursive в Windows, и он отлично работает. Выполнял "lein pom; lein jar; lein install" в командной строке Windows.
endbegin
4
Вам только нужно сделать lein install. Он построит для вас банку и помпон.
neverfox
15

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

Артур Ульфельдт
источник
5
Спасибо, я разберусь. Хотя должен сказать, что maven вселяет страх в мое сердце. Если вы знаете какие-либо простые пошаговые примеры для этого, укажите мне их. Почему сборки в мире Java такие чертовски сложные?
signalseeker 08
4

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

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

хорошо относись к своим модам
источник
3

Ни одно из этих решений у меня не помогло. Вместо этого я установил локальный репозиторий и использовал 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 ]

Рузбех Забихоллахи
источник
2

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

Паскаль Тивент
источник
0

Лучший вариант - настроить частный артефактор 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.

NB. SCP, развертываемые в Clojars, больше не поддерживаются.

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

Робин
источник