Leiningen: ¿cómo agregar dependencias para archivos jar locales?
Pregunta
Quiero utilizar leiningen para construir y desarrollar mi proyecto clojure.¿Hay alguna manera de modificar project.clj para indicarle que elija algunos archivos jar de los directorios locales?
Tengo algunos archivos jar propietarios que no se pueden cargar en repositorios públicos.
Además, ¿se puede utilizar leiningen para mantener un directorio "lib" para proyectos de clojure?Si varios de mis proyectos de clojure comparten los mismos frascos, no quiero mantener una copia separada para cada uno de ellos.
Gracias
Solución
Podrías poner tus frascos privados en lib/
y estarían en el classpath para los propósitos de lein swank
y similares;Esto parece anular el objetivo de utilizar una herramienta de gestión de dependencias, aunque si no lo haces desear esas dependencias administradas, podría tratar a Leiningen como una "herramienta de administración de dependencias de código abierto" y tal vez tener cuidado con lein clean
.
A medida que la situación se vuelve más compleja (hay una mayor cantidad de archivos privados involucrados, evolucionan y es necesario tener en cuenta cierta información de versiones sobre ellos), la idea de Arthur de crear un repositorio privado de Maven puede ser más apropiada.
(HR significa punto de corte de piezas específico de Leiningen...Continúe a continuación para obtener información sobre la historia general de las herramientas de gestión de dependencias/construcción en Clojure Land, incluidos algunos enlaces que creo que podrían resultar muy útiles en su situación).
Además, hasta el momento, no existe un acuerdo universal sobre cuál es la mejor herramienta de construcción para Clojure, y Leiningen, aunque gana en popularidad, también gana constantemente en las áreas de características y pulido, lo que significa, en particular, que aún no está completo.Aquí hay una cita de Stuart Halloway, autor de "Programming Clojure" de Pragmatic Bookshelf:"Mi 2c:Leiningen es un paso importante, pero aún queda mucho por hacer." Para la publicación completa y una discusión muy interesante sobre:construir herramientas y similares en el espacio Clojure, consulte el Leiningen, Clojure y bibliotecas:¿Qué me estoy perdiendo? Hilo en el grupo Clojure de Google.Muchos participantes mencionan específicamente la necesidad de tener dependencias locales que no estén contenidas en ningún repositorio, local o no, y explican las soluciones que han encontrado para tales escenarios.¿Quizás podrías ver si hay algo allí que pueda resolver tu problema ahora o que pueda resolverlo en el futuro, cuando los conjuntos de funciones maduren?
De todos modos, es posible que Leiningen no tenga todavía una buena historia lista para algunos escenarios complejos.Si cree que esto puede ser cierto en su caso (y me refiero a después de considerar la idea del repositorio privado), aquí hay algunos enlaces a alternativas basadas en Maven tomadas del hilo mencionado anteriormente: experto políglota, complemento-clojure-maven; esta publicación de blog pretende ser útil para las personas que intentan utilizar maven con Clojure.Según recuerdo, Meikel Brandmeyer (también en SO bajo su identificador en línea de kotarak) usa Gradle (un sistema de compilación Groovy) con un complemento para acomodar Clojure llamado Clojuresque;Nunca lo probé yo mismo, ya que no sé nada sobre Groovy, pero afirma que hace un acto de construcción muy bueno con él y creo que no tiene nada que ver con maven, algo que es una ventaja en sí mismo. para algunos de nosotros.:-)
Otros consejos
Sólo tiene que utilizar : recursos-caminos en su archivo project.clj. Lo uso, por ejemplo, para conectarse a los servidores Siebel. Acaba de crear un recursos de directorio en mi directorio del proyecto y copiado los archivos jar en ese país. Pero, por supuesto, se puede utilizar un directorio de más genérico:
(defproject test-project "0.1.0-SNAPSHOT"
:description "Blah blah blah"
...
:resource-paths ["resources/Siebel.jar" "resources/SiebelJI_enu.jar"])
Luego de la Lein repl que puede crear instancias de datos de Siebel Bean, por ejemplo.
(def sbl (com.siebel.data.SiebelDataBean.))
(.login sbl "siebelServer" "user" "password")
...
Si usted tiene una versión más reciente de Java se puede utilizar comodines del curso en su especificación de ruta como esta para un directorio más general:
:resource-paths ["/tmp/SiebelJars/*"]
-
Crear un directorio en el proyecto:
mkdir maven_repository
-
Añadir frascos locales a este repositorio:
Por ejemplo, el comando agrega el archivo
jaad-0.8.3.jar
al experto repositorio:mvn deploy:deploy-file -Dfile=jaad-0.8.3.jar -DartifactId=jaad -Dversion=0.8.3 -DgroupId=jaad -Dpackaging=jar -Durl=file:maven_repository
-
Agregue lo siguiente a
project.clj
:repositories {"local" "file:maven_repository"}
-
Ahora, un
lein deps
regular debe trabajar:$ 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
La advertencia puede ser ignorada, ya que el frasco se registró en el proyecto y no descargado de Internet.
Fuente original: Usando JAR de locales con Leiningen (cambiado desde la copia)
Me parece lein pom; lein jar; lein install
funciona bien en el desarrollo de las bibliotecas.
Para ello, en la biblioteca están desarrollando y su aplicación que requiera lo usará sin ningún foo :repositories
necesario.
Alternativamente, lein do pom, jar, install
es ligeramente más concisa.
Esto permite llamar a la biblioteca como cualquier otra :dependencies [[project-name "version"]]
Creo que el enfoque de "correcta" es crear un repositorio Maven privada para que pueda almacenar los frascos en un solo lugar y todas sus ramas, etc va a recoger a los cambios. Esto puede ser excesiva para lo que estás haciendo. Estoy ansioso por ver si estos es una forma más fácil.
Es posible que quiera utilizar el lein-localrepo
plugin: https://github.com/kumarshantanu/lein-localrepo
Un desarrollo reciente es el plugin s3-wagon-private
de Phil como Leiningen: https://github.com/technomancy/ s3-vagón-privada
Esto debería permitirle publicar artefactos a un acuerdo de recompra remoto privado.
Ninguna de estas soluciones me funcionó. En su lugar he instalado un repositorio local, y se utiliza Maven para instalar el archivo jar en el repositorio local y añadido el repositorio local para mi project.clj
En la línea de comandos:
mvn deploy:deploy-file -DgroupId=local -DartifactId=bar \
-Dversion=1.0.0 -Dpackaging=jar -Dfile=bar.jar \
-Durl=file:repo
Y escribo mis project.clj como esto:
(defproject foo "0.1.0-SNAPSHOT"
:dependencies [[org.clojure/clojure "1.4.0"]
[local/bar "1.0.0"]]
:repositories {"project" "file:repo"})
Espero que ayuda.
[REFERENCIA: https://gist.github.com/stuartsierra/3062743 ]
Trate de mi solución de cómo construir archivo jar con dependencias http: // middlesphere-1 .blogspot.ru / 2014/06 / how-to-make-jar-con-dependencias-using.html
La mejor opción es configurar un privado Artifactory JFrog / Nexus y desplegar sus instantáneas / comunicados de allí y luego añadir que artifiactory como repositorios en que project.clj
Otras formas más simples son
HTTP estático El tipo más simple de depósito privado es un servidor web apuntando a un directorio lleno de archivos estáticos. Puede utilizar una URL file: /// en sus:. Repositorios para desplegar esa manera si el directorio es local a la máquina donde se está ejecutando Leiningen
SCP Si ya tiene un servidor configurado con sus claves públicas SSH, el transporte SCP es una forma sencilla de publicar y consumir dependencias privadas. Coloque el siguiente defproject interior:
:plugins [[org.apache.maven.wagon/wagon-ssh-external "2.6"]]
:repositories [["releases" "scp://somerepo.com/home/repo/"]]
A continuación, coloque la siguiente fuera del 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 []))))
También es posible desplegar a un repositorio usando el transporte SCP y consumir de ella a través de HTTP si se configura nginx o algo similar para servir al directorio del repositorio a través de HTTP.
N.B. SCP despliega a Clojars ya no son soportados
Fuente original está aquí https://github.com/technomancy /leiningen/blob/stable/doc/DEPLOY.md