leiningen - como adicionar dependências para jars locais?

117

Eu quero usar o leiningen para construir e desenvolver meu projeto clojure. Existe uma maneira de modificar o project.clj para dizer a ele para escolher alguns jars dos diretórios locais?

Tenho alguns jars proprietários que não podem ser carregados em repositórios públicos.

Além disso, o leiningen pode ser usado para manter um diretório "lib" para projetos clojure? Se vários dos meus projetos de clojure compartilharem os mesmos jars, não quero manter uma cópia separada para cada um deles.

obrigado

buscador de sinais
fonte
1
Obrigado a todos. Como foi apontado a todos, esta é uma questão espinhosa, sem uma resposta clara disponível ainda.
signalseeker

Respostas:

38

Você poderia colocar seus frascos privados lib/e eles estariam no caminho de classe para fins de lein swanke semelhantes; isso parece anular o uso de uma ferramenta de gerenciamento de dependências, embora se você realmente não quiser que essas dependências sejam gerenciadas, você poderia tratar Leiningen como uma "ferramenta de gerenciamento de dependências de código aberto" e talvez tenha cuidado lein clean.

Conforme a situação se torna mais complexa - há um número maior de jars privados envolvidos, eles evoluem e você precisa levar em consideração algumas informações de versão sobre eles - a ideia de Arthur de criar um repositório Maven privado pode ser mais apropriada.


(O RH significa o ponto de corte da peça específica de Leiningen ... Continue abaixo para obter informações sobre a história geral de ferramentas de gerenciamento de construção / dependência em terras Clojure, incluindo alguns links que acho que podem ser muito úteis na sua situação.)

Além disso, até o momento, não há um acordo universal sobre a questão de qual é a melhor ferramenta de construção para Clojure, e Leiningen, enquanto ganha em participação, também está constantemente ganhando nas áreas de recursos e polimento - o que significa, em particular, que ainda não está completo. Aqui está uma citação de Stuart Halloway, autor de "Programming Clojure" do Pragmatic Bookshelf: "Meu 2c: Leiningen é um passo importante, mas ainda há muito o que fazer." Para a postagem completa e uma discussão muito interessante sobre ferramentas de construção e similares no espaço Clojure, consulte Leiningen, Clojure e bibliotecas: o que estou perdendo?tópico no grupo Clojure Google. Muitos participantes mencionam especificamente a necessidade de ter dependências locais não contidas em nenhum repositório, local ou não, e elaboram as soluções que eles criaram para tais cenários. Talvez você possa ver se há algo lá que pode resolver seu problema agora / pode resolvê-lo no futuro, quando os conjuntos de recursos amadurecerem?

De qualquer forma, é possível que Leiningen ainda não tenha uma boa história pronta para alguns cenários complexos. Se você acha que isso pode ser verdade no seu caso (e quero dizer, depois de considerar a ideia de repositório privado), aqui estão alguns links para alternativas baseadas em maven retiradas do tópico mencionado acima: polyglot maven , clojure-maven-plugin ; esta postagem do blogpretende ser útil para pessoas que tentam usar o maven com Clojure. Pelo que me lembro, Meikel Brandmeyer (também no SO sob seu nome online de kotarak) usa Gradle (um sistema de compilação Groovy) com um plugin para acomodar Clojure chamado Clojuresque; Eu nunca tentei, pois não sei nada sobre o Groovy, mas ele afirma ter uma ótima construção com ele e acredito que não tenha nada a ver com o maven - algo que é um ponto positivo por si só para alguns de nós. :-)

Michał Marczyk
fonte
2
Re: "não há um acordo universal sobre a questão de qual é a melhor ferramenta de compilação para Clojure" ... A partir de hoje, parece que Leiningen é o padrão fugitivo agora. Resultados da pesquisa de 2013: lein-survey-2013.herokuapp.com/results
David J.
8
A partir do Leiningen v2, a funcionalidade lib / diretório foi removida. Consulte: github.com/technomancy/leiningen/wiki/…
Jared314
A partir de hoje, Leiningen provavelmente ainda é o mais popular, mas Boot também é popular.
Mars
64

Basta usar : resource-path em seu arquivo project.clj. Eu o uso, por exemplo, para me conectar a servidores Siebel. Acabei de criar um diretório de recursos no diretório do meu projeto e copiei os arquivos jar lá. Mas é claro que você pode usar um diretório mais genérico:

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

Então, a partir do lein repl , posso criar instâncias do Siebel Data Bean, por exemplo

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

Se você tiver uma versão mais recente do Java, é claro que pode usar curingas na especificação do caminho como este para um diretório mais geral:

:resource-paths ["/tmp/SiebelJars/*"]
Hans-J.
fonte
Lein 2 não suporta globbing, mas o plugin github.com/dchelimsky/lein-expand-resource-paths está disponível se você precisar.
pondermatic
2
Esta é a melhor resposta que já vi até agora. A instalação local do mvn parece não funcionar mais para mim.
David Williams
7
Isso não funciona com o uberjar, pois o uberjar adicionará os jars de dependência no jar, em vez de adicionar os arquivos de classe de dependências.
Tobias Domhan
50
  1. Crie um diretório no projeto:

    mkdir maven_repository

  2. Adicione jars locais a este repositório:

    Por exemplo, este comando adiciona o jaad-0.8.3.jararquivo ao repositório 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. Adicione o seguinte a project.clj

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

  4. Agora, um regular lein depsdeve funcionar:

    $ 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

O aviso pode ser ignorado, pois o jar será verificado no projeto e não baixado da internet.

Fonte original: usando JARs locais com Leiningen (alterado desde a cópia)

Janus Troelsen
fonte
Bons passos neste link. Isso foi muito útil para mim.
goger
2
com versões mais recentes, você pode querer usar mvn deploy: deploy-file em vez de install: install-file e especificar -Durl = file: repo em vez de -DlocalRepositoryPath = repo. Em projects.clj você pode usar:: repositories {"local" "file: maven_repository"} Veja: gist.github.com/stuartsierra/3062743 (Eu editei a questão, mas ainda precisa ser aprovado)
Tobias Domhan
33

eu acho lein pom; lein jar; lein install funciona bem ao desenvolver bibliotecas.

Faça isso na biblioteca que está sendo desenvolvida e seu aplicativo que requer isso irá usá-lo sem qualquer :repositoriesfoo necessário.


Como alternativa, lein do pom, jar, installé um pouco mais conciso.


Isso permite chamar a biblioteca como qualquer outro :dependencies [[project-name "version"]]

Greg B
fonte
3
Em comparação com as outras soluções, isso é tão simples e funciona! Não há necessidade de instalar o maven. Obrigado.
dkinzer
Como você referencia o jar resultante em um arquivo de projeto lein?
interstar
Como qualquer outro:dependencies [[project-name "version"]]
roboli
1
Isso funciona muito bem no Windows também. Não há necessidade de instalar o maven como já foi mencionado. Eu tentei com IntelliJ + Cursive no Windows e funcionou perfeitamente. Fiz um "lein pom; lein jar; lein install" na linha de comando do Windows.
fim de
4
Você só precisa fazer lein install. Isso vai construir o jarro e o pom para você.
neverfox,
15

Eu acredito que a abordagem "correta" é criar um Repositório Maven privado para que você possa armazenar os jars em um único local e todas as suas filiais etc irão pegar as mudanças. Isso pode ser um exagero para o que você está fazendo. Estou curioso para saber se essa é uma maneira mais fácil.

Arthur Ulfeldt
fonte
5
Obrigado, vou dar uma olhada nisso. Embora eu deva dizer que o maven causa medo em meu coração. Se você conhece algum exemplo simples passo a passo para fazer isso, indique-me. Por que as compilações são tão complicadas no mundo java?
signalseeker
3

Nenhuma dessas soluções funcionou comigo. Em vez disso, instalei um repositório local e usei o maven para instalar o arquivo jar no repo local e adicionei o repo local ao meu project.clj

Na linha de comando:

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

E eu escrevo meu project.clj assim:

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

Espero que ajude.

[REFERÊNCIA: https://gist.github.com/stuartsierra/3062743 ]

Roozbeh Zabihollahi
fonte
2

Talvez dê uma olhada nesta resposta anterior , eu forneço instruções passo a passo para configurar um repositório local para o projeto (acessado por meio file://) no qual você pode instalar seus jars.

Pascal Thivent
fonte
0

A melhor opção é configurar um artifactory JFrog / Nexus privado e implantar seus instantâneos / lançamentos lá e, em seguida, adicionar esse artifiactory como repositórios em seu project.clj

Outras maneiras mais simples são

HTTP estático O tipo mais simples de repositório privado é um servidor web apontado para um diretório cheio de arquivos estáticos. Você pode usar um arquivo: /// URL em seus: repositórios para implantar dessa forma se o diretório for local para a máquina em que Leiningen está sendo executado.

SCP Se você já tem um servidor configurado com suas chaves públicas SSH, o transporte scp é uma maneira simples de publicar e consumir dependências privadas. Coloque o seguinte defeito interno:

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

Em seguida, coloque o seguinte fora do defeito:

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

Também é possível implantar em um repositório usando o transporte scp e consumir dele por http se você configurar o nginx ou algo semelhante para servir o diretório do repositório por HTTP.

NB SCP implantações para Clojars não são mais suportadas

A fonte original está aqui https://github.com/technomancy/leiningen/blob/stable/doc/DEPLOY.md

Robin
fonte