为什么 `lein uberjar` 计算用 `def` 定义的变量?

2023-11-27

我试图在创建时理解“Lieningen”行为uberjar。以下是重现该行为的最小示例:

(ns my-stuff.core
  (:gen-class))

(def some-var (throw (Exception. "boom!")))

(defn -main [& args]
  (println some-var))

当执行此操作时lein run它显然因异常而失败。但是,我不明白为什么要执行lein uberjar也因变量定义异常而失败?为什么执行lein uberjar尝试评估变量值?这是具体针对uberjar任务还是我错过了有关 Clojure 或 Leiningen 的更实质性内容?


为了编译 uberjar 的命名空间(如果您打开了 AOT),clojure 编译器必须加载您的命名空间。这将始终调用所有顶级副作用。

处理这个问题的最佳方法是永远不要在顶级代码中产生副作用(无论是在内部还是外部)def形式),并具有初始化函数来实现所需的任何启动副作用。

解决方法可以是创建一个小型命名空间,使用内省在运行时加载其余代码,而不是在编译时加载 - 使用如下函数:

(defn -main
  []
  (require 'my.primary.ns)
  ((resolve 'my.primary.ns/start)))

如果该命名空间已编译,则 jvm 可以找到 -main 并运行它,尽管没有编译任何其他代码。运行时require将导致 Clojure 编译器仅在运行时加载其余代码,并且resolve需要这样-main将干净地编译 - 它返回引用的 var,然后在调用时调用您的函数。

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

为什么 `lein uberjar` 计算用 `def` 定义的变量? 的相关文章

  • Clojure:只能从尾部位置重复

    我正在尝试递归地反转列表 但是我得到了Can only recur from tail position运行时 这到底意味着什么 如何改进我的代码才能使其正常工作 defn recursive reverse coll loop coll
  • 如何编写 Clojure 宏来从字符串创建正则表达式?

    我正在创建一个方便的宏 部分便利在于可以仅使用字符串来指定正则表达式 而不是使用 re 表示法 我无法弄清楚的一部分是如何让宏获取字符串并将其重写为 Clojure 正则表达式 例如 生成 re 符号 我认为这是一个语法 转义问题 我的第一
  • 在 Clojure 中解压缩 zlib 流

    我有一个二进制文件 其内容由zlib compress在Python上 有没有一种简单的方法可以在Clojure中打开和解压缩它 import zlib import json with open data json zlib wb as
  • 如何安装 leiningen 插件?

    如何安装 leiningen 插件 例如 leiningen run 我看到这个叫做 clojars org 的东西 以及如何 推 它 但我没有看到任何关于从中 拉 的东西 如果 Clojars 上有可用的插件 例如 lein run 只需
  • 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
  • 如何使用clojure中的map函数打印哈希映射列表的每个元素?

    我正在构建一个哈希映射列表 然后将其传递给另一个函数 当我尝试使用打印列表中的每个哈希映射时map它不工作 我可以打印完整列表或获取第一个元素等 defn m a println a map println a 以下仅适用于 repl m
  • 与doseq(或for)并行遍历集合的有效方法?

    doseq e coll1 myfunc e 如果您只关心副作用 那么速度非常快 如果我想要怎么办myfunc 并行 地从多个集合中获取元素 即 applymyfunc到每个集合的第一个元素 然后到所有第二个元素 然后到所有第三个元素 依此
  • 如何在 RHEL 6.1 / JDK7 上安装 Clojure 1.3 with contribs?

    我一直在努力让它发挥作用 获取 clojure 1 3 是一件轻而易举的事 但现在我一直在尝试安装 contrib 库 但遇到了错误 有关于如何正确执行此操作的指南吗 旧的 clojure contrib 整体库与 clojure 1 3
  • 从外部 clojar 导入/使用资源

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

    我正在尝试自学 clojure 并使用 Prime Factors Kata 和 TDD 的原则来实现这一目标 通过一系列 Midje 测试 如下所示 fact primefactors 1 gt list fact primefactor
  • 使用命令行界面构建 Clojure 应用程序?

    我刚刚开始使用 Clojure 来自 Ruby 我想构建一个带有命令行界面的小型应用程序 如何处理 CL 的输入 输出 我注意到有一个 clojure contrib command line 但文档很少 http github com r
  • 在 Clojure 中的函数上使用“apply”时,如何显式指定名称空间?

    这里的 graph 是高阶函数 它返回一个在其范围内设置了配置的函数 ns bulbs neo4jserver graph defn out1 Test func that simply returns out1 config out1 d
  • 如何将 clojure Web 应用程序部署到 Amazon EC2(AWS Elastic Beanstalk + Leiningen + Compojure + Ring + Tomcat)

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

    我正在编写一个使用 STM 的 clojure 程序 目前 我在启动时从数据库填充 STM 使用引用 然后在 dosync 事务成功时异步更新数据库 我不知道我是否以正确的方式这样做 或者是否有更好的标准技术来做到这一点 谁能向我解释一下他
  • 如何在 REPL 中显示 Clojure 中函数的定义?

    我正在寻找让 REPL 打印函数当前定义的能力 有什么办法可以做到这一点吗 例如 给定 defn foo if true true 我想说类似的话 print definition foo 并得到一些类似的东西 foo if true tr
  • Linux 上的 Clojure 实时浏览器重新加载

    有没有类似的东西机架实时重载 https github com johnbintz rack livereload可以与类似的工具一起使用Guard LiveReload https github com guard guard liver
  • defn 和 defmacro 和有什么不一样?

    defn 和 defmacro 和有什么不一样 函数和宏有什么区别 defn定义一个函数 defmacro定义一个宏 函数和宏之间的区别在于 在函数调用时 首先评估函数的参数 然后使用参数评估函数体 另一方面 宏描述了从一段代码到另一段代码
  • 如何在数组类型上调度多方法

    我正在研究一种多方法 需要更新序列中一堆不同事物的哈希值 看起来相当简单 直到我尝试输入 X 数组的类型 defmulti update hash class 2 type byte 1 gt java lang Byte defmetho
  • 使用“lein run”运行时关闭挂钩不会触发

    我有以下代码 ns test hook core defn main addShutdownHook Runtime getRuntime Thread println shutdown println start doseq i rang

随机推荐

  • Jade - 添加动态包含的方法

    我想在玉模板中执行类似以下操作 include page content view template 因为这行不通 所以我就这样结束了 if view path include page content home else if view
  • 在 Azure 网站上禁用池回收

    我在 Azure 网站上部署了一个网站 我想禁用池回收 如果您有常规 IIS 安装 则可以通过将 回收 gt 禁用重叠回收 设置为 true 在应用程序池高级设置中禁用此功能 然而 我似乎无法在天蓝色管理控制台中找到此选项 也没有在网上找到
  • 在 Ruby on Rails 中连接 Sql 服务器

    我是新手ruby on rails 我想知道如何连接Sql server到 Rails 应用程序 我正在 Windows 环境中使用 RoR 有没有建立连接的链接SQL Server in ROR 我还没有在 Windows 上这样做过 但
  • 从 Facebook Graph API 获取超过 25 张照片

    我正在尝试使用 Graph API 检索用户被标记的所有照片 但我只能获取最新的 25 张 是否有可能获得更多 如果可以 如何获得 您是否尝试过添加限制和偏移参数 引用文档 Paging 查询连接时 有几个有用的参数可让您过滤和分页连接数据
  • 在 Google 地图上加载标记的自定义信息窗口时,iOS 应用程序冻结

    我正在尝试在 iOS 应用程序上的 Google 地图标记上实现自定义信息窗口 正如所做的那样here and here例如 我创建了一个 xib 和一个UIView为它上课 它被称为CustomInfoWindow xib班级是Custo
  • C#与Excel互操作问题,保存excel文件不流畅

    我可以打开并写入 Excel 文件 但是当我尝试通过传递路径来保存文件时 保存操作会提示 保存 对话框 我期待它能够完全将文件保存在指定路径 代码如下 excelApp Save exportToDirectory excelApp Qui
  • C# 中的三元数受到限制有什么充分的理由吗?

    Fails object o 1 2 1 test 成功 object o if 1 2 o 1 else o test 第一条语句的错误是 无法确定条件表达式的类型 因为 int 和 string 之间没有隐式转换 为什么需要这样 我将这
  • 将本地 Git 存储库从 IDE 迁移到 Visual Studio Online

    我在 Visual Studio Online 上创建了一个新的团队项目 已在 Visual Studio 2013 中连接到该项目 使用 IDE 我将本地 Git 存储库 从 GitHub 上拉下来 克隆到本地 Git 存储库部分 当我浏
  • 直接从字节数组裁剪图像

    我有一个字节数组 其中包含一个图像 我想将其保存为裁剪后的 我的工作方法是 获取字节 使用 BitmapFactory decodebytearray 将其转换为位图 使用 createbitmap sourceBitmap x1 y1 w
  • 在 SQL Server 2005 中创建新的数据库用户

    如何在sql server 2005中创建一个带有密码的新数据库用户 我需要在连接字符串中使用此用户 密码 例如 uid user pwd password CREATE LOGIN user WITH PASSWORD password
  • Python 将 Adblock 与 Selenium 和 Firefox Webdriver 结合使用

    我的目标是通过 Python 将 Adblock Plus 与 Selenium 结合使用 我已经能够将其加载到加载扩展程序的位置 但默认情况下它不包含默认过滤器 EasyList 这是我到目前为止所拥有的 from selenium im
  • 比较两个通用数字的值

    我想与两种类型的变量进行比较T extends Number 现在我想知道两个变量中哪个大于另一个或相等 不幸的是我还不知道确切的类型 我只知道它将是java lang Number 我怎样才能做到这一点 EDIT 我尝试了另一种解决方法T
  • 从 docker 注册表 v2 中删除镜像

    Docker Registry v2 有一个 API 端点来删除镜像 DELETE v2
  • 将 R 文件转换为缺少字符串值的 Stata

    我在将 R 文件转换为 Stata 格式时遇到错误 我能够将数字转换为 Stata 文件 但当我包含字符串时 出现以下错误 library foreign write dta newdata X dta Error in write dta
  • 有没有一种规范的方法可以从特定的原子命名空间中获取所有标识?

    说我有 user name and user gender作为原子模式安装 pprint d q find ident where e db ident ident db install attribute e d db conn 找到所有
  • 创建文件,但如果名称存在则添加编号

    Python 是否有任何内置功能可以在文件名已存在的情况下向其添加数字 我的想法是 它会像某些操作系统的工作方式一样工作 如果一个文件输出到已经存在该名称的文件的目录 它将附加一个数字或递增它 即 如果 file pdf 存在 它将创建 f
  • 使用jquery获取按钮点击时元素的id

    我有动态生成的按钮列表 并且 id 是在运行时生成的 如何使用 JQuery 获取单击按钮的 id 这是js代码 var btn
  • SQLite 和存储图像

    我想知道哪种方式更好地将图像存储在内存中 Storing images as BLOB in DB or 仅将图像保存到文件并存储path到数据库中 什么方式效率更高 我认为存储文件的路径需要更多操作 因为我们需要引用数据库 然后引用文件
  • 在哪里可以找到 Windows API 常量列表

    每次我与 user32 dll 等 dll 交互时 我都需要 MF REMOVE 等常量 是否有所有这些常量的概述或常量所有这些常量的 C 库 您将在 win32 API 的 C 标头中找到所有常量 获取此信息的低技术方法是简单地在 Vis
  • 为什么 `lein uberjar` 计算用 `def` 定义的变量?

    我试图在创建时理解 Lieningen 行为uberjar 以下是重现该行为的最小示例 ns my stuff core gen class def some var throw Exception boom defn main args