在Clojure中编写JavaFX项目

在Clojure中编写JavaFX项目,javafx,clojure,leiningen,Javafx,Clojure,Leiningen,我试图理解如何正确地设置JavaFX以使用Clojure项目。通过阅读各种资料,我得出以下结论: 这是project.clj: (defproject cljfx "0.1.0-SNAPSHOT" :description "FIXME: write description" :url "http://example.com/FIXME" :license {:name "Eclipse Public License" :url "http://www.ecl

我试图理解如何正确地设置JavaFX以使用Clojure项目。通过阅读各种资料,我得出以下结论:

这是project.clj:

(defproject cljfx "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"]]
  :resource-paths ["lib/jfxrt.jar"]
  :main ^:skip-aot cljfx.core
  :target-path "target/%s"
  :profiles {:uberjar {:aot :all}})
我不知道是应该使用:resource路径还是通过:dependencies向量将JavaFX添加到类路径中

这是core.clj:

我已经将本教程中的一个示例翻译为Clojure:

这没有编译,我不知道我做错了什么。。。你能帮我吗

以下是错误:
可能还有其他问题,但pastebin日志中的根本问题是:

Caused by: clojure.lang.ArityException: Wrong number of args (2) passed to: core/-start
当使用gen类并提供方法实现时,每个方法都需要将实例本身作为第一个参数。公约使用“this”:


试试看,并确保本地实例方法调用应用于“this”

我的错,我不知道。。。但是,本地实例方法是什么意思?-main是否应该使用[this&args]而不是[&args]?我注意到在-start中添加“this”可以让它工作,但是我不能在-main中使用它来代替cljfx.core,可以吗?不,main是一个公共静态函数,就像一个全局函数一样。它所在的命名空间在project.clj中指定。start,otoh,是一个应用程序实例方法。它只能看到类应用程序中可用字段的特定实例或副本。无论如何,可能需要的另一个地方是handle方法,它可能需要(handle[this event]…因为正在创建的是EventHandler的实例。嗯,好吧…那project.clj呢?我仍然无法用“lein run”编译项目(它会用cljfx.core引发ClassNotFound异常…奇怪)但是,如果我构建uberjar,然后将其作为java程序运行,它就可以工作了……我应该使用:resource path还是:dependencies来添加javafx?删除项目并使用:resource path现在就可以了,但我仍然不知道为什么以前没有这样做使用“aot”时可能会出现问题或者提前编译。问题的关键在于有两种依赖项解析机制-clojure命名空间和java类路径。它们可以以奇怪的、有时不合适的方式进行交互,需要微妙地使用aot。短版本是-project.clj中的^skip aot子句可能是错误的,应该删除(我认为),并在主要更改之间使用“leinclean”清理从clojure源代码生成的编译类文件。
Caused by: clojure.lang.ArityException: Wrong number of args (2) passed to: core/-start
(defn -start [this primaryStage]