我正在为 Leiningen 编写一个自定义插件,它将有助于部署用 Clojure 编写的 AWS Lambda 函数。我在用着aws-java-sdk-lambda
版本1.11.145
它依赖于杰克逊2.6.x
, 具体来说2.6.5
IIRC.
由于我将其编写为插件,因此代码在 Leiningen 的上下文中执行(即:eval-in-leiningen true
)并且,据我所知,受莱宁根本身的依赖关系的影响。
这是一个问题,因为我正在运行的 Leiningen 版本(2.7.1
) 取决于柴郡5.5.0
这反过来又依赖于杰克逊2.5.3
。这导致NoSuchMethodError
当 AWS 开发工具包尝试调用时com.fasterxml.jackson.databind.JavaType.isReferenceType()
。 AFAIK,jackson-core-2.6.5
(由 AWS 拉入)正在尝试调用jackson-databind-2.5.3
(由柴郡间接拉动)。至少这似乎是正在发生的事情。
第一个问题:这是一个已知问题吗?我无法在 SO、Google 或 Leiningen 的 GitHub 页面上问题的第一页上找到任何直接引用它的内容(我没有在那里进行详尽的搜索)。第二:有人对解决这个问题有什么建议吗?:exclusions
似乎是显而易见的选择,但我不确定如何指定莱宁根本身作为依赖项引入的某些内容的排除。
下面,我提供了简单的项目规范来重现该错误:
插件的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
这反过来会触发错误。