我正在为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/38,https://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/