为什么 Leiningen 不能总是正确使用我的 :gen-class ?

2024-02-27

假设我创建了一个新的 Leiningen 项目(lein new app example)并添加一些代码example/src/example/core.clj这利用了:gen-class:

(ns example.core
  (:gen-class :extends javafx.application.Application))

(defn -start [this stage]
  (.show stage))

(defn -main [& args]
  (javafx.application.Application/launch example.core args))

如果我然后创建一个 JAR (lein uberjar)并运行它,一切正常。但是,如果我尝试直接运行我的应用程序(lein run),我得到一个ClassNotFoundException。另外,如果我打开一个 REPL (lein repl),我首先得到与之前相同的错误,但运行此代码后:

(compile 'example.core)

该错误不再出现在lein run or lein repl.

有人可以向我解释一下这里到底发生了什么,以及如何直接运行我的应用程序而不需要从 REPL 手动编译我的代码吗?

Edit: 经过一番闲逛,我发现解决这个问题的方法是添加

:aot [example.core]

to project.clj。 (谢谢@Mars!)不过,我仍然很困惑,因为我之前曾尝试简单地删除^:skip-aot,其中(根据the docs https://github.com/technomancy/leiningen/blob/master/sample.project.clj#L189-L190) 应该管用:

默认情况下,这将是 AOT 编译;要禁用此功能,请附加^:skip-aot命名空间符号的元数据。

但事实并非如此。为什么?

另一个编辑(如果我应该将其中任何一个问题分成一个单独的问题,请告诉我,我会这样做):我一直在使用连字符(lein new app my-example),奇怪的事情一直在发生。这不起作用:

(ns my-example.core
  (:gen-class :extends javafx.application.Application))
;; ...
(defn -main [& args]
  (javafx.application.Application/launch my-example.core args))

但这确实:

(ns my-example.core
  (:gen-class
    :name my-example.Core
    :extends javafx.application.Application))
;; ...
(defn -main [& args]
  (javafx.application.Application/launch my-example.Core args))

所以我的班级名称可以以小写字母开头(example.core) 或包含连字符 (my-example.Core), 但不是两者兼而有之?我真的不明白。

最后,lein uberjar最后一个例子失败了(明确的:name), 因为

Warning: The Main-Class specified does not exist within the jar. It may not be executable as expected. A gen-class directive may be missing in the namespace which contains the main method.

据我所知,解决这个问题的唯一方法就是拆分Application子类到单独的命名空间中。还有别的办法吗?


同意@Mars,问题是lein run不AOTexample.core命名空间。默认的 Leiningen 模板使example.core非 AOT:

(defproject example "0.1.0-SNAPSHOT"
  ...
  :main ^:skip-aot example.core
  ...)

我最好的猜测是你可以使用定义你的应用程序defrecord并将其用作类而不是名称空间。

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

为什么 Leiningen 不能总是正确使用我的 :gen-class ? 的相关文章

  • 在 Clojure 和其他 Lisp 方言中,在函数名称末尾使用星号的约定是什么?

    请注意 我不是在谈论符号名称中的耳罩 这个问题在Clojure 常量的约定 样式和用法 https stackoverflow com questions 3579063 conventions style and usage for cl
  • Clojure 集合与序列的相等性

    我注意到 Clojure 1 4 似乎很乐意考虑向量等于seq相同的向量 但同样不适用于地图 1 2 seq 1 2 gt true 1 2 seq 1 2 gt false 为什么要这样的行为 这样会有所不同吗 Clojure 的 可以认
  • 如何编写 Clojure 宏来从字符串创建正则表达式?

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

    我正在编写一个 Clojure 实现这次编码挑战 http biostar stackexchange com questions 1759 code golf mean length of fasta sequences 尝试找出 Fas
  • clojure 有 AES 库吗?

    clojure 有 AES 加密库吗 我应该使用通过 maven 或 clojars 提供的 java 库吗 感谢您的时间和考虑 下面是一个使用可用的 java 加密库的可能更惯用的示例 encrypt and decrypt这里每个都简单
  • 我可以让 lein cloverage 跳过特定测试吗?

    我正在进行一个 Leiningen 项目 其集成测试注释如下 deftest manual test v3 preview preview client http localhost 10313 v3 preview 当我这样做时 这些测试
  • 如何使用 clojurescript repl 评估宏

    一旦浏览器连接到 clojurescript repl 我以前就无法从 repl 调用宏 这个问题过去曾让我放弃使用 clojurescript 而更喜欢直接使用 javascript 基本上 我觉得 cljs repl 有点蹩脚 我又回到
  • 如何解构向量以用作函数参数

    在 Python 中 您可以将列表或元组传递给函数并让函数解压参数 我怎样才能在 Clojure 中做到这一点 下面是一些 Python 代码示例 def f a b c d print a a print b b print c c pr
  • Clojure 的分析工具?

    有谁知道 Clojure 有一个好的分析工具或库吗 我更喜欢可以从 REPL 中使用的东西 类似于 with profiling 过去是在 Allegro Common Lisp 中 有什么类似的事情吗 或者您是否有过与 Clojure 配
  • 如何在 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
  • clojure - 不同命名空间中的评估代码

    我正在编写类似 REPL Server 的代码 用户的请求在这样的函数中评估 defn execute request str try eval read string request catch Exception e getLocali
  • 惰性序列内部究竟如何工作

    我是 clojure 的新手 不清楚惰性序列在内部是如何工作的 或者更具体地说 返回惰性序列的函数意味着只有在需要时才会计算结果 例如在下面的例子中 defn fc lazy fn xs lazy seq if let xss seq xs
  • Clojure 中的宏和函数

    我在这个 Clojure 教程中读到了以下行 http java ociweb com mark clojure article html Macros http java ociweb com mark clojure article h
  • 调用 Clojure 高阶函数

    如果我定义一个返回如下函数的函数 defn add n n fn x x n 然后我可以将结果分配给一个符号 def add 1 add n 1 并称其为 add 1 41 gt 42 我如何调用结果 add n 1 而不将其分配给新符号
  • 如何禁用 Clojure 断言,包括前提条件?

    在 REPL 中禁用 Clojure 断言 包括前置条件和后置条件 有哪些好方法 对于任意的莱宁根轮廓 Per https github com technomancy leiningen blob b82b228 sample proje
  • 为什么 CouchDB 使用仅追加 B+ 树而不是 HAMT

    我正在阅读数据结构 尤其是不可变的数据结构 例如仅追加 B 树 http guide couchdb org draft btree html用于 CouchDB 和哈希数组映射 trie http en wikipedia org wik
  • 为什么多种方法不能用作试剂/重新构建的功能?

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

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

    我正在寻找让 REPL 打印函数当前定义的能力 有什么办法可以做到这一点吗 例如 给定 defn foo if true true 我想说类似的话 print definition foo 并得到一些类似的东西 foo if true tr

随机推荐