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

StackOverflow https://stackoverflow.com/questions/2404426

Вопрос

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

У меня есть несколько проприетарных jar-файлов, которые нельзя загрузить в общедоступные репозитории.

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

Спасибо

Это было полезно?

Решение

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

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


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

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

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

Другие советы

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

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

Затем из Лейн Репл Я могу создавать экземпляры Siebel Data Bean, например.

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

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

:resource-paths ["/tmp/SiebelJars/*"]
  1. Создайте каталог в проекте:

    mkdir maven_repository

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

    Например, эта команда добавляет 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-файлов с Лейнингеном (изменено после копирования)

я нахожу lein pom; lein jar; lein install хорошо работает при разработке библиотек.

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


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


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

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

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

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

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

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

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

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

И я пишу свой проект.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 ]

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

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

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

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

Статический HTTP Самый простой вид частного репозитория — это веб-сервер, указывающий на каталог, полный статических файлов.Вы можете использовать URL-адрес file:/// в своих :repositories для развертывания таким образом, если каталог является локальным для машины, на которой работает 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.

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top