我正在爲Leiningen編寫一個定製插件,這將有助於部署用Clojure編寫的AWS Lambda函數。我使用aws-java-sdk-lambda
版本1.11.145
,它對Jackson 2.6.x
有依賴性,特別是2.6.5
IIRC。如何爲編寫插件時由leiningen提供的依賴關係排除?
由於我將此作爲插件編寫,代碼在Leiningen的上下文中執行(即:eval-in-leiningen true
),並且AFAIK受Leiningen本身的依賴關係支配。
這是一個問題,因爲我運行的Leiningen版本(2.7.1
)依賴於Cheshire 5.5.0
,而這反過來依賴於Jackson 2.5.3
。當AWS SDK嘗試呼叫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
的實例,這將反過來引發該錯誤。