参考AOT编译中的Clojure生成类?

时间:2014-12-30 16:37:15

标签: clojure

此代码无法使用lein compile进行编译。重要的部分是gen-class-main函数。代码使用JavaFX 8和Clojure 1.7,但这些只是细节。我的问题是关于AOT编译以及如何引用生成的类。

(ns the.app
  (:import
   [javafx.application Application]
   [javafx.scene Scene]
   [javafx.scene.layout StackPane]
   [javafx.stage Stage])
  (:gen-class
   :name the.app.App
   :extends javafx.application.Application
   :main true))

(defn start
  [^Application app
   ^Stage stage
   {:keys [width height title] :as opts}]
  (let [root (StackPane.)
        scene (Scene. root width height)]
    (if title (.setTitle stage title))
    (.setScene stage scene)
    (.show stage)))

(defn -start
  [app stage]
  (start app stage {:title "App" :width 800 :height 600}))

(defn -stop
  [app]
  (println "-stop"))

(defn -main
  [& args]
  (Application/launch the.app.App args))

我的project.clj包含:

:dependencies [[org.clojure/clojure "1.7.0-alpha4"]]
:aot [the.app]
:main the.app

错误消息是:

Caused by: java.lang.ClassNotFoundException: the.app.App

我原以为编译会创建the.app.App。如何解决引用课程compiled from AOT的问题?

1 个答案:

答案 0 :(得分:1)

我发现使用resolve有效(而不是直接引用该类):

(defn -main
  [& args]
  (Application/launch (resolve 'the.app.App) args))

这意味着当the.app.App表单为evaluated时,defn不一定存在。该类只需要在运行时存在,这将在AOT编译后发生。