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

2023-11-30

我正在为 Leiningen 编写一个自定义插件,它将有助于部署用 Clojure 编写的 AWS Lambda 函数。我在用着aws-java-sdk-lambda版本1.11.145它依赖于杰克逊2.6.x, 具体来说2.6.5 IIRC.

由于我将其编写为插件,因此代码在 Leiningen 的上下文中执行(即:eval-in-leiningen true)并且,据我所知,受莱宁根本身的依赖关系的影响。

这是一个问题,因为我正在运行的 Leiningen 版本(2.7.1) 取决于柴郡5.5.0这反过来又依赖于杰克逊2.5.3。这导致NoSuchMethodError当 AWS 开发工具包尝试调用时com.fasterxml.jackson.databind.JavaType.isReferenceType()。 AFAIK,jackson-core-2.6.5(由 AWS 拉入)正在尝试调用jackson-databind-2.5.3(由柴郡间接拉动)。至少这似乎是正在发生的事情。

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

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

插件的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 及其所有依赖项,而这些依赖项不是shaded。这意味着,如果 Jackson 类之间发生任何冲突,则始终会选择 Leiningen 类。这种做法特别狡猾的是,您不会收到任何有关冲突依赖项的警告,因为 JAR 不会冲突,但它们的内容会冲突。

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

第二:有人对解决这个问题有什么建议吗?

Clojure 与同一库的不同主要版本的相互依赖性问题对一般情况有一些建议,尽管当 Lein 的依赖关系非常严重时,它会变得有点棘手。

我认为此时最好的选择是隐藏 Jackson 依赖项和 AWS SDK。

莱宁根大师不再依赖柴郡不过,当 2.8.0 发布时,问题应该会减少。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在编写插件时,如何排除 leiningen 引入的依赖项? 的相关文章

  • Clojure def 与 defn 对于没有参数的函数

    我用 clojure 编写了一个程序 但有些函数没有参数 将此类函数编码为 def 而不是不带参数的 defn 有什么优点 def t0 System currentTimeMillis defn t1 System currentTime
  • Clojure 中没有整数溢出?

    我在阅读时在 IntelliJ IDEA 中运行 Clojure 1 3 0 和 La ClojureClojure 的乐趣 在第 4 1 3 节 第 64 页 中 作者使用以下代码演示了整数溢出 Integer MAX VALUE Int
  • 如何使用clojure中的map函数打印哈希映射列表的每个元素?

    我正在构建一个哈希映射列表 然后将其传递给另一个函数 当我尝试使用打印列表中的每个哈希映射时map它不工作 我可以打印完整列表或获取第一个元素等 defn m a println a map println a 以下仅适用于 repl m
  • Visual Studio 插件开发第一步

    我想为 Visual Studio 制作一个插件 但我不知道从哪里开始 虽然找到 Eclipse 插件开发指南非常容易 但我很难找到好的 VS 插件开发指南 我想我想问的是 我从哪里开始 我建议从这里开始 http www mztools
  • Java 中 .NET 的 Lambda 表达式

    我最近 再次 从 C 迁移到 Java 但我非常怀念 lambda 表达式和 C 的 IEnumerable Foreach 之类的东西 所以我正在寻找Java中的lambda表达式库 有比这更好的图书馆吗LambdaJ http code
  • 为什么 clojure-mode 用一些卷曲的 f 字符替换 fn ?

    我刚刚开始使用 emacs 入门套件和 clojure 模式 现在 当我输入或粘贴 fn 在 Clojure 模式下进入缓冲区 fn 字符在窗口中被替换为稍微卷曲的小写字母 f 缓冲区已正确保存 但这非常烦人 尤其是当我以艰难的方式发现该功
  • jQuery - 检测鼠标是否静止?

    我想知道是否有一种方法可以检测 jQuery 中鼠标是否空闲了 3 秒 是否有我不知道的插件 因为我不相信有一个原生的 jQuery 方法 任何帮助将非常感激 您可以收听mousemove事件 每当发生时启动超时并取消任何现有超时 var
  • 如何检查spec/col-of中的不同ID

    s def users s coll of user distinct true 上面的规范要求每个用户映射都是不同的 但是我如何指定它来检查不同的 user ids only 不应允许以下集合 id 10 name Jessica id
  • eclipse.ui.menus 的名称过滤器

    我有一个菜单贡献 通过实现org eclipse ui menus扩展点 我想仅为特定文件扩展名 例如 pld 提供此菜单贡献 但我不知道如何使用 visibleWhen 来做到这一点 有任何想法吗 更新 到目前为止我的扩展点
  • Clojure实现多线程的最佳方法?

    我正在开发一个用 Clojure 编写的 MUD 客户端 现在 我需要两个不同的线程 一种接收用户的输入并将其发送到 MUD 通过简单的套接字 另一种读取 MUD 的输出并将其显示给用户 我应该只使用 Java 线程 还是应该使用一些特定于
  • 竞争条件和 Clojure Atoms

    clojure atom 的文档指出 Changes to atoms are always free of race conditions 然而 竞争条件不仅是根据更改定义的 而且是在不同线程中并行逻辑操作的上下文中定义的 我想知道 保证
  • 如何解构向量以用作函数参数

    在 Python 中 您可以将列表或元组传递给函数并让函数解压参数 我怎样才能在 Clojure 中做到这一点 下面是一些 Python 代码示例 def f a b c d print a a print b b print c c pr
  • 如何在 Compojure 中使用 lib-noir 有状态会话

    我想我这里有一个相当简单的问题 但我已经看这个屏幕太久了 所以我正在尝试 但失败了 让有状态会话在 Compojure 中工作 refheap代码粘贴is here https www refheap com paste 11161 你可以
  • Clojure 尾递归与质因数

    我正在尝试自学 clojure 并使用 Prime Factors Kata 和 TDD 的原则来实现这一目标 通过一系列 Midje 测试 如下所示 fact primefactors 1 gt list fact primefactor
  • 动态 crm 中的 AppDomain.CurrentDomain.AssemblyResolve

    因此 我收到了很多参考使用的文章AppDomain CurrentDomain AssemblyResolve在运行时将 DLL 从嵌入式资源加载到插件中 不使用 IlMerge 但是 当我插入此代码时 在插件为主库抛出 TypeLoadE
  • 如何在 Clojure 中创建循环(且不可变)数据结构而不需要额外的间接?

    我需要在 Clojure 中表示有向图 我想将图中的每个节点表示为一个对象 可能是一条记录 其中包含一个名为 edges这是从当前节点直接可达的节点的集合 希望这是不言而喻的 但我希望这些图表是不可变的 我可以构造有向acyclic只要我进
  • Vim:垂直选项卡列表可以吗?

    是否可以让 vim 的选项卡列表垂直显示在编辑器的左侧 这确实很有帮助 但我还没有找到任何可以做到这一点的插件 我对谷歌很烂吗 我同意兰迪关于选项卡使用的观点 但前段时间我也在寻找在 gvim 中添加垂直制表符的可能性 为此 您必须修改源
  • 如何将 clojure Web 应用程序部署到 Amazon EC2(AWS Elastic Beanstalk + Leiningen + Compojure + Ring + Tomcat)

    如题 我的IDE是intellij idea 12 1 4 我需要什么工具包或插件才能 将 Clojure Web 应用程序部署到 Amazon EC2 有任何链接或参考或分步解决方案吗 谢谢 如果您只是部署一个 war 文件 没有其他自定
  • vim 中的 python 2 支持

    我正在尝试设置 YouCompleteMe 一个 vim 代码完成插件 当我运行 vim 时 它给我这个错误消息 YouCompleteMe unavailable 需要 python 2 x 我的 ubuntu 机器上安装了正确版本的 p
  • 为什么多种方法不能用作试剂/重新构建的功能?

    在我正在构建的使用 Reagent 和 Re frame 的小型应用程序中 我使用多种方法来根据应用程序状态中的值分派应显示哪个页面 defmulti pages name defn main panel let current route

随机推荐

  • 如何检测纯文本中没有锚元素的链接

    如果用户在文本框中输入文本并保存它 然后再次添加更多文本 他可以编辑该文本并在需要时保存它 首先 如果用户输入带有某些链接的文本 我会检测到它们并将任何超链接转换为在新选项卡中链接 其次 如果用户想添加更多文本和链接 他单击编辑并添加它们并
  • 模式中带 & 不带“fixed”的 b/w str_detect 有什么区别?

    这是示例字符串 x lt My name is XYZ I m from ABc working at PQR 并想要检测字符串中的 并使用两种形式 gt str detect x 1 TRUE gt gt str detect x fix
  • Url.Action 参数?

    在我列出的控制器中 public ActionResult GetByList string name string contact var NameCollection Service GetByName name var Contact
  • 如何修复命令帮助已注册的discord.py

    我正在尝试向我的机器人添加帮助命令 但是当我运行代码时出现此错误 raise discord ClientException Command 0 name is already registered format command disco
  • Angularfire 2 错误:未为此 Firebase 启用指定的身份验证提供程序

    我正在创建一个简单的示例身份验证应用程序 使用 Ionic 2 和 angularfire 2 作为后端 当我尝试创建新用户时 它说 例外 错误 未捕获 承诺中 错误 指定的 未为此 Firebase 启用身份验证提供程序 But i al
  • Facebook Realtime API 中的验证令牌是什么

    我正在尝试使用我的应用程序实现 Facebook Realtime api 我想从我的 Facebook 页面 中提取提要 我已经获得了app access token app access token xxxxxxxxxxxxxxxxxx
  • 将 Chrome 本机消息连接到 Windows 上的现有实例

    我创建了一个 chrome 后台脚本和一个使用 python 运行的主机 通过执行 清单 中链接的 bat 文件来运行 一切都还不错 但据我所知 每次我使用 chrome 扩展连接到主机以进行本机消息传递时 我都会创建 python 实例并
  • 在大型数据集上有效计算分段回归

    我目前有一个很大的数据集 我需要计算分段回归 或以类似的方式拟合分段线性函数 然而 我既有一个很大的数据集 也有非常多的碎片 目前我有以下方法 Let si be the end of segment i Let xi yi denote
  • Elastic Search 嵌套对象查询

    我有一个如下所示的弹性搜索索引集合 index test type abc source file name xyz ex metadata format ex profile date value 2018 05 30T00 00 00
  • 雪豹、sqlite3-ruby

    所以我遵循了每一个建议这个线程 没有成功 我正在运行 os x 10 6 rails 2 3 3 ruby 1 9 1 当我尝试访问 Rails 应用程序的首页时仍然收到此错误 未初始化常量 SQLite3 Driver Native Dr
  • 如何将 Java Gradle 项目转换为 Dynamic Web 项目?

    我正在关注这篇文章 https www linkedin com pulse building jax rs project eclipse gradle neeraj malhotra 关于如何使用 Gradle 在 Eclipse 中构
  • 在 bash 中重定向 STDIN?

    举个例子 我想用密码登录mysql 我知道我可以使用 pmypass 但我想了解如何在 bash 中重定向标准输入 所以我的测试是 mysql u limited user p
  • 限制 NSURLConnection 数据速率? (带宽限制)

    有没有办法限制 NSURLConnection 使用的带宽 或者我被迫使用 CFNetwork 方法 是的 但它并不漂亮 它的工作原理是这个邮件列表帖子 在后台线程上启动 NSURLConnection 您必须设置一个运行循环 睡个懒觉 c
  • 从 SourceSafe 迁移到 ClearCase 的最佳方式是什么?

    我们目前有一个丰富的 SourceSafe DB 里面有十年的代码 我们正在寻找一种简单且稳定的方法来将所有这些导入到新的 Clearcase Jazz 环境中 执行此操作的最佳方法是什么 是否有任何工具可以自动执行此操作 我知道这并不能直
  • Laravel - Sendgrid smtp 错误“不允许 550 未经身份验证的发件人”

    我正在关注使用 smtp 集成 Laravel Sendgrid发送电子邮件 我按照文档所述操作 所有凭据都与我的 sendgrid 凭据相同 但每当我尝试使用发送电子邮件时 Mail send mails demo data functi
  • 我应该如何让 Xcode 链接使用 C++ 静态库的 iOS 项目

    使用 Xcode 我编写了一个 Cocoa Touch 静态库 主要是用 C 编写的 它公开了一个 C 接口 以方便 Objective C 客户端代码 我有一个使用它的客户端 iOS 应用程序 一切都按预期运行 除了我发现我需要包含一个最
  • 拖放:通过使用 copyArrayItem(),拖放的项目不应从开始数组中删除,同时放置 Angular 8

    我有一个项目列表 我可以从其中拖动项目并将其放入另一个列表中 我在用着复制数组项 Angular 中的方法不从前一个数组中删除该项目 我开始拖动 该项目位于前一个数组中 该项目的占位符显示出来 开始拖动 占位符出现 我要离开之前的数组 占位
  • 以最快的方式使用数组索引按降序打印矩阵的排序元素

    这似乎是一个简单的问题 但我在快速完成此任务时遇到困难 假设我有一个矩阵 我想对该矩阵进行排序并按降序存储元素的索引 有没有快速的方法来做到这一点 现在 我正在提取最大值 存储结果 将其更改为 2 然后在 for 循环中提取下一个最大值 这
  • 分页在 DRF APIView 中不起作用

    我在用APIView用于获取和发布项目 我想使用 Django Rest Framework 为我的 API 实现分页 但它不起作用 我想每页显示 10 个项目 但是当我这样做时api v1 items page 1 我得到了所有的物品 如
  • 在编写插件时,如何排除 leiningen 引入的依赖项?

    我正在为 Leiningen 编写一个自定义插件 它将有助于部署用 Clojure 编写的 AWS Lambda 函数 我在用着aws java sdk lambda版本1 11 145它依赖于杰克逊2 6 x 具体来说2 6 5 IIRC