Como faço exclusões para dependências extraídas por leiningen ao escrever um plug-in?
Estou escrevendo um plug-in personalizado para Leiningen que ajudará na implantação de funções do AWS Lambda escritas no Clojure. estou a usaraws-java-sdk-lambda
versão1.11.145
que depende de Jackson2.6.x
especificamente2.6.5
IIRC.
Como estou escrevendo isso como um plug-in, o código está sendo executado no contexto de Leiningen (ou seja,:eval-in-leiningen true
) e, AFAIK, está sujeito às dependências da própria Leiningen.
Este é um problema, pois a versão de Leiningen que estou executando (2.7.1
) depende de Cheshire5.5.0
que, por sua vez, depende de Jackson2.5.3
. Isso resulta em umNoSuchMethodError
quando o AWS SDK tenta chamarcom.fasterxml.jackson.databind.JavaType.isReferenceType()
. ATÉ ONDE SEI,jackson-core-2.6.5
(puxado pela AWS) está tentando entrarjackson-databind-2.5.3
(puxado indiretamente por Cheshire). Pelo menos é o que parece estar acontecendo.
Primeira pergunta: este é um problema conhecido? Não consegui encontrar nada que o referencia diretamente no SO, no Google ou na primeira página de problemas na página do GitHub de Leiningen (não fiz uma pesquisa exaustiva por lá). Segundo: alguém tem alguma sugestão para solucionar esse problema?:exclusions
parece a escolha óbvia, mas não tenho certeza de como especificar uma exclusão para algo que a própria Leiningen está utilizando como dependência.
Abaixo, incluí especificações simples do projeto para reproduzir o erro:
do 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 fonte do plugin:
(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"))
usuário do pluginproject.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}})
Uma vez configurado, executelein install
do diretório do plug-in e, em seguida, executelein aws-plugin
do diretório de usuários do plug-in. Isso deve tentar criar uma instância deAWSLambdaClient
que, por sua vez, acionará o erro.