5

新しい 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 または にエラーが表示されなくなりましたlein repl

ここで正確に何が起こっているのか、REPL からコードを手動でコンパイルすることなくアプリを直接実行する方法を教えてください。

編集:もう少し浮気した後、この問題の解決策は追加することであることがわかりました

:aot [example.core]

project.clj。(@Marsに感謝します!)ただし、以前に単純に削除しようとしたため、まだ混乱しています( docs^:skip-aotによると)動作するはずです:

これはデフォルトで 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サブクラスを別の名前空間に分割することです。別の方法はありますか?

4

1 に答える 1

3

@Marsに同意しましたが、問題は名前空間lein runをAOTしないことです。example.coreデフォルトの Leiningen テンプレートでは、example.core非 AOTが作成されました。

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

私の最善の推測は、アプリを使用して定義し、defrecordそれを名前空間の代わりにクラスとして使用できるということです。

于 2015-09-19T04:47:19.390 に答える