【发布时间】:2017-08-24 18:51:07
【问题描述】:
我正在为 Leiningen 编写一个自定义插件,这将有助于部署用 Clojure 编写的 AWS Lambda 函数。我正在使用aws-java-sdk-lambda 版本1.11.145,它依赖于Jackson 2.6.x,特别是2.6.5 IIRC。
由于我将其编写为插件,因此代码在 Leiningen 的上下文中执行(即:eval-in-leiningen true),并且,AFAIK 受制于 Leiningen 本身的依赖关系。
这是一个问题,因为我正在运行的 Leiningen 版本 (2.7.1) 依赖于 Cheshire 5.5.0,而 Cheshire 5.5.0 又依赖于 Jackson 2.5.3。当 AWS 开发工具包尝试调用 com.fasterxml.jackson.databind.JavaType.isReferenceType() 时,这会导致 NoSuchMethodError。 AFAIK,jackson-core-2.6.5(由 AWS 拉入)正试图呼叫jackson-databind-2.5.3(由 Cheshire 间接拉入)。至少这似乎是正在发生的事情。
第一个问题:这是一个已知问题吗?我在 SO、Google 或 Leiningen 的 GitHub 页面上的第一页问题上找不到任何直接引用它的东西(我没有在那里进行详尽的搜索)。第二:有人对解决这个问题有什么建议吗? :exclusions 似乎是显而易见的选择,但我不确定如何为 Leiningen 本身作为依赖项引入的东西指定排除项。
下面,我已经包含了简单的项目规范来重现错误:
插件的project.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)
插件源代码:
(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"))
插件用户的project.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}})
设置完成后,从插件目录运行lein install,然后从插件用户目录运行lein aws-plugin。这应该会尝试创建AWSLambdaClient 的实例,这反过来会触发错误。
【问题讨论】: