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