2017-08-24 44 views
3

我正在爲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的實例,這將反過來引發該錯誤。

回答

2

First question: is this a known issue?

這是一個已知的問題,許多人都在寫Leiningen插件。根本原因是Leiningen構建了一個uberjar及其所有的依賴關係,而這些依賴關係不是shaded。這意味着如果傑克遜班級之間有任何衝突,萊寧寧的班級將永遠被選中。是什麼讓這個特別狡猾的是,你不會有任何關於衝突依賴關係的警告,因爲JAR不衝突,但是它們的內容確實存在。

下面是這個問題的幾個例子:https://github.com/s3-wagon-private/s3-wagon-private/issues/38,https://github.com/technomancy/leiningen/issues/2215

Second: Does anyone have any suggestions for working around this problem?

Issues with Clojure inter-dependency with different major versions of the same library有一般情況下提出了一些建議,但它變得有點棘手時,雷音的依賴性uberjarred。

我認爲在這一點上最好的選擇是屏蔽Jackson依賴和AWS SDK。

Leiningen master no longer depends on Cheshire雖然,當2.8.0發佈時,你應該有更少的問題。