¿Cómo hago exclusiones para las dependencias que leiningen obtiene al escribir un complemento?
Estoy escribiendo un complemento personalizado para Leiningen que ayudará a implementar las funciones de AWS Lambda escritas en Clojure. Estoy usandoaws-java-sdk-lambda
versión1.11.145
que depende de Jackson2.6.x
específicamente2.6.5
IIRC.
Como estoy escribiendo esto como un complemento, el código se está ejecutando en el contexto de Leiningen (es decir,:eval-in-leiningen true
) y, AFAIK, está sujeto a las dependencias de Leiningen.
Este es un problema ya que la versión de Leiningen que estoy ejecutando (2.7.1
) depende de Cheshire5.5.0
que, a su vez, depende de Jackson2.5.3
. Esto resulta en unNoSuchMethodError
cuando el SDK de AWS intenta llamarcom.fasterxml.jackson.databind.JavaType.isReferenceType()
. HASTA DONDE SE,jackson-core-2.6.5
(arrastrado por AWS) está intentando llamarjackson-databind-2.5.3
(tirado, indirectamente, por Cheshire). Al menos eso es lo que parece estar sucediendo.
Primera pregunta: ¿es un problema conocido? No pude encontrar nada directamente haciendo referencia a él en SO, Google o la primera página de problemas en la página GitHub de Leiningen (no hice una búsqueda exhaustiva allí). Segundo: ¿Alguien tiene alguna sugerencia para solucionar este problema?:exclusions
parece ser la opción obvia, pero no estoy seguro de cómo se podría especificar una exclusión para algo que Leiningen está tomando como una dependencia.
A continuación, he incluido especificaciones de proyecto simples para reproducir el error:
pluginproject.clj
:
(defproject aws-plugin "0.1.0-SNAPSHOT"
:description "FIXME: write description"
:url "http://example.com/FIXME"
:license {:name "Eclipse Public License"
:url "http://www.eclipse.org/legal/epl-v10.html"}
:dependencies [[com.amazonaws/aws-java-sdk-lambda "1.11.145"]]
:eval-in-leiningen true)
código fuente del complemento:
(ns leiningen.aws-plugin
(:import (com.amazonaws.services.lambda AWSLambdaClient
AWSLambdaClientBuilder)))
(def aws-lambda-client (-> (AWSLambdaClient/builder) (.build)))
(defn aws-plugin
"I don't do a lot, or anything at all."
[project &]
(println "Create Lambda"))
usuario del complementoproject.clj
(defproject aws-plugin-user "0.1.0-SNAPSHOT"
:description "FIXME: write description"
:url "http://example.com/FIXME"
:license {:name "Eclipse Public License"
:url "http://www.eclipse.org/legal/epl-v10.html"}
:dependencies [[org.clojure/clojure "1.8.0"]]
:target-path "target/%s"
:plugins [[aws-plugin "0.1.0-SNAPSHOT"]]
:profiles {:uberjar {:aot :all}})
Una vez que esto esté configurado, ejecutelein install
desde el directorio de complementos y luego ejecutarlein aws-plugin
desde el directorio de usuarios del complemento. Esto debería intentar crear una instancia deAWSLambdaClient
que, a su vez, activará el error.