我正在为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)依赖于柴郡5.5.0,而柴郡2.5.3则依赖于杰克逊NoSuchMethodError。当AWS开发工具包尝试调用com.fasterxml.jackson.databind.JavaType.isReferenceType()时,这将导致jackson-core-2.6.5。 AFAIK,jackson-databind-2.5.3(由AWS拉入)正尝试调用:exclusions(由Cheshire间接拉入)。至少这似乎正在发生。

第一个问题:这是一个已知问题吗?我无法在SO,Google或Leiningen的GitHub页面的问题首页上找到直接引用它的任何内容(我在那里没有进行详尽的搜索)。第二:有人对解决此问题有任何建议吗? project.clj似乎是一个显而易见的选择,但我不确定雷宁根本人将其作为依赖项引入的排除方式。

下面,我提供了简单的项目规范来重现该错误:

插件的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"))


插件用户的lein install

(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 aws-plugin,然后从插件用户目录运行AWSLambdaClient。这应该尝试创建的实例,该实例将依次触发错误。

最佳答案

第一个问题:这是一个已知问题吗?


这是一个已知问题,许多编写Leiningen插件的人都会遇到这个问题。根本原因是Leiningen用其所有依赖项构建了一个uberjar,而这些依赖项不是shaded。这意味着,如果杰克逊班级之间发生冲突,将始终选择莱宁根的班级。使得这种情况特别令人反感的是,您不会收到有关冲突依赖项的任何警告,因为JAR不会发生冲突,但是它们的内容却会发生冲突。

以下是此问题的一些示例:https://github.com/s3-wagon-private/s3-wagon-private/issues/38https://github.com/technomancy/leiningen/issues/2215


第二:有人对解决此问题有任何建议吗?


Issues with Clojure inter-dependency with different major versions of the same library对于一般情况有一些建议,尽管在Lein的依赖关系被超级压缩时会变得有些棘手。

我认为此时最好的选择是隐藏Jackson依赖项和AWS开发工具包。

虽然Leiningen master no longer depends on Cheshire,当2.8.0发布时,您应该会遇到较少的问题。

关于plugins - 编写插件时,如何排除leiningen引入的依赖项?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/45868991/

10-10 17:52
查看更多