Plugins 在编写插件时,如何排除leiningen拉入的依赖项?
我正在为Leiningen编写一个自定义插件,它将有助于部署用Clojure编写的AWS Lambda函数。我使用的是aws java sdk lambda版本Plugins 在编写插件时,如何排除leiningen拉入的依赖项?,plugins,clojure,leiningen,Plugins,Clojure,Leiningen,我正在为Leiningen编写一个自定义插件,它将有助于部署用Clojure编写的AWS Lambda函数。我使用的是aws java sdk lambda版本1.11.145,它依赖于Jackson2.6.x,特别是2.6.5IIRC 因为我是作为插件编写的,所以代码是在Leiningen的上下文中执行的(即Leiningen true中的:eval),而且,AFAIK受Leiningen本身的依赖关系的影响 这是一个问题,因为我运行的Leiningen版本(2.7.1)依赖于柴郡5.5.0,
1.11.145
,它依赖于Jackson2.6.x
,特别是2.6.5
IIRC
因为我是作为插件编写的,所以代码是在Leiningen的上下文中执行的(即Leiningen true中的:eval
),而且,AFAIK受Leiningen本身的依赖关系的影响
这是一个问题,因为我运行的Leiningen版本(2.7.1
)依赖于柴郡5.5.0
,而柴郡5.5.0又依赖于Jackson2.5.3
。当AWS SDK尝试调用com.fasterxml.jackson.databind.JavaType.isReferenceType()
时,这会导致NoSuchMethodError
。AFAIK,jackson-core-2.6.5
(由AWS引入)正试图调用jackson-databind-2.5.3
(由柴郡间接引入)。至少这似乎正在发生
第一个问题:这是一个已知的问题吗?我无法在Google或Leiningen的GitHub页面上找到任何直接引用它的内容(我没有在那里进行详尽的搜索)。第二:有人对解决这个问题有什么建议吗<代码>:排除
似乎是显而易见的选择,但我不确定如何为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
的实例,从而触发错误
第一个问题:这是一个已知的问题吗
这是一个众所周知的问题,也是许多编写Leiningen插件的人面临的问题。根本原因是Leiningen构建了一个包含所有依赖项的uberjar,而这些依赖项不是。这意味着,如果Jackson类之间存在冲突,则始终会选择Leiningen的类。这一点尤其令人费解的是,您不会收到任何关于冲突依赖项的警告,因为jar并不冲突,但它们的内容却冲突
下面是这个问题的几个例子:
第二:有人对解决这个问题有什么建议吗
对一般情况有一些建议,尽管当Lein的依赖项被破坏时会变得有点棘手
我认为在这一点上,最好的办法是隐藏Jackson依赖项和AWS SDK
不过,当2.8.0发布后,问题应该会少一些
第一个问题:这是一个已知的问题吗
这是一个众所周知的问题,也是许多编写Leiningen插件的人面临的问题。根本原因是Leiningen构建了一个包含所有依赖项的uberjar,而这些依赖项不是。这意味着,如果Jackson类之间存在冲突,则始终会选择Leiningen的类。这一点尤其令人费解的是,您不会收到任何关于冲突依赖项的警告,因为jar并不冲突,但它们的内容却冲突
下面是这个问题的几个例子:
第二:有人对解决这个问题有什么建议吗
对一般情况有一些建议,尽管当Lein的依赖项被破坏时会变得有点棘手
我认为在这一点上,最好的办法是隐藏Jackson依赖项和AWS SDK
不过,当2.8.0发布后,问题应该会少一些