在编写插件时,如何排除 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
  • Android Studio 上的代码 Iris 插件

    我正在尝试使代码 iris 插件在 Android studio 上工作 我按右键单击 gt 创建代码虹膜图 然后我收到一条通知 表明我的图表已准备就绪 但我不知道该图何时存储 创建的文件的名称是什么以及如何打开它 有任何想法吗 CODE
  • 我可以让 lein cloverage 跳过特定测试吗?

    我正在进行一个 Leiningen 项目 其集成测试注释如下 deftest manual test v3 preview preview client http localhost 10313 v3 preview 当我这样做时 这些测试
  • 我如何在环中模拟 json post 请求?

    我正在使用橄榄石 https github com xeqi peridot https github com xeqi peridot测试我的环应用程序 它工作正常 直到我尝试使用 json 数据模拟 post 请求 require ch
  • Clojure 中没有整数溢出?

    我在阅读时在 IntelliJ IDEA 中运行 Clojure 1 3 0 和 La ClojureClojure 的乐趣 在第 4 1 3 节 第 64 页 中 作者使用以下代码演示了整数溢出 Integer MAX VALUE Int
  • 内存数据存储中有 Clojure 吗?

    我主要在 Node 中编程 并且喜欢文档存储 但我想首先对客户端和服务器之间的数据调用进行原型设计 我用过lowdb https github com typicode lowdb and da base https github com
  • Java 中 .NET 的 Lambda 表达式

    我最近 再次 从 C 迁移到 Java 但我非常怀念 lambda 表达式和 C 的 IEnumerable Foreach 之类的东西 所以我正在寻找Java中的lambda表达式库 有比这更好的图书馆吗LambdaJ http code
  • jQuery - 检测鼠标是否静止?

    我想知道是否有一种方法可以检测 jQuery 中鼠标是否空闲了 3 秒 是否有我不知道的插件 因为我不相信有一个原生的 jQuery 方法 任何帮助将非常感激 您可以收听mousemove事件 每当发生时启动超时并取消任何现有超时 var
  • Clojure MySQL 语法错误异常(“[...] 靠近 '???????????????' [...]”)

    除了建立连接之外 我在使用 clojure contrib sql 做任何事情时都遇到困难 我有一个 mysqld 在 localhost 3306 上运行 数据库名为clj db 用户 clj user localhost 和密码 clj
  • 用于生成多色文本的 jQuery 插件,该文本可在悬停时改变颜色

    我想为各种链接生成多色文本 并从预先指定的颜色数组中为各个字母随机分配颜色 当将鼠标悬停在带有文本的 div 上时 颜色会发生变化 我正在考虑一个 jQuery 插件 脚本将是可行的方法 我想知道是否存在这样的插件或近似插件 Thanks
  • eclipse.ui.menus 的名称过滤器

    我有一个菜单贡献 通过实现org eclipse ui menus扩展点 我想仅为特定文件扩展名 例如 pld 提供此菜单贡献 但我不知道如何使用 visibleWhen 来做到这一点 有任何想法吗 更新 到目前为止我的扩展点
  • WooCommerce - 按下按钮时更新所有产品描述(全站点)

    我一直在使用以下代码 希望能够创建一个按钮 按下它 然后我网站上的所有描述都会自动生成 梦想 我的问题 为什么我的代码没有按预期更新所有产品 到目前为止 我有以下代码 虽然它在一定程度上可以工作 但当按钮位于产品页面上时无法正常工作 它将更
  • Clojure 的映射和减少 Monad...Juxt Monad 怎么样?

    在学习 Clojure 的过程中 我花了很长时间试图理解 monad 它们是什么以及我们如何使用它们 但没有取得太大成功 然而 我发现了一个很棒的 Monads for Dummies 视频系列 http vimeo com 2071730
  • 如何创建浏览器插件?

    我必须创建一个插件 当用户将鼠标悬停在某些术语上时 该插件必须显示信息 谁能告诉我如何做的方向 我对创建插件没有太多想法 我知道我想要做的事情可以通过java脚本来完成 但是java脚本文件可以作为浏览器插件安装吗 任何对此的想法将不胜感激
  • 如何在 Compojure 中使用 lib-noir 有状态会话

    我想我这里有一个相当简单的问题 但我已经看这个屏幕太久了 所以我正在尝试 但失败了 让有状态会话在 Compojure 中工作 refheap代码粘贴is here https www refheap com paste 11161 你可以
  • 从外部 clojar 导入/使用资源

    我想做的是将一个大文件 MIDI 声音字体 打包到一个独立的 Maven repo clojar 中 然后能够以编程方式将其拉下来并从单独的项目中使用它 事实证明 这个看似简单的任务比我想象的要复杂 理想的情况是 如果有一种方法可以直接访问
  • Clojure 尾递归与质因数

    我正在尝试自学 clojure 并使用 Prime Factors Kata 和 TDD 的原则来实现这一目标 通过一系列 Midje 测试 如下所示 fact primefactors 1 gt list fact primefactor
  • 惰性序列内部究竟如何工作

    我是 clojure 的新手 不清楚惰性序列在内部是如何工作的 或者更具体地说 返回惰性序列的函数意味着只有在需要时才会计算结果 例如在下面的例子中 defn fc lazy fn xs lazy seq if let xss seq xs
  • 触摸滚动 Jquery 插件 - 如何为多个实例使用不同选项进行初始化?

    正如这里所发现的 https github com neave touch scroll https github com neave touch scroll function Define default scroll settings
  • 如何在 Highcharts / Highstock 上显示 x 轴上的十字线选定值和 y 轴上选定的日期?

    我正在研究这个项目 其中包括在交互式图表上显示历史数据 我得出的结论是 Highcharts Highstock 是最好的选择 因为它提供了最多的定制选项 我想要实现的目标是 当我将鼠标悬停在一个点上时 分别在 x 轴和 y 轴上显示所选值

随机推荐

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

    如果用户在文本框中输入文本并保存它 然后再次添加更多文本 他可以编辑该文本并在需要时保存它 首先 如果用户输入带有某些链接的文本 我会检测到它们并将任何超链接转换为在新选项卡中链接 其次 如果用户想添加更多文本和链接 他单击编辑并添加它们并
  • 模式中带 & 不带“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