Plugins 在编写插件时,如何排除leiningen拉入的依赖项?

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,

我正在为Leiningen编写一个自定义插件,它将有助于部署用Clojure编写的AWS Lambda函数。我使用的是aws java sdk lambda版本
1.11.145
,它依赖于Jackson
2.6.x
,特别是
2.6.5
IIRC

因为我是作为插件编写的,所以代码是在Leiningen的上下文中执行的(即Leiningen true中的
:eval
),而且,AFAIK受Leiningen本身的依赖关系的影响

这是一个问题,因为我运行的Leiningen版本(
2.7.1
)依赖于柴郡
5.5.0
,而柴郡
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
(由柴郡间接引入)。至少这似乎正在发生

第一个问题:这是一个已知的问题吗?我无法在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发布后,问题应该会少一些