2

Clojure アプリを .jar と .war の両方の形式でデプロイしようとしています。これまでのところ、.jar の展開に成功しました。私は.warに取り組んでいます。このアプリは、Clojure と JavaFX の機能の一部を実証するための単なるテスト アプリです。AWS Elastic Beanstalk を介して、セットアップを始めたばかりのウェブサイトにデプロイするつもりです。現時点では、アプリは 600x600 のステージを 40 秒間移動するぼやけた円の束を表示するだけです。ただし、この 40 秒間はアプリケーションが正常に実行されていても、40 秒間のアニメーションの後、アプリケーションは常に突然終了します。私の project.clj ファイルは次のようになります。

(defproject clojurefx/arg "0.0.10-SNAPSHOT"
  :description "Helper functions and probably a wrapper to simplify usage of JavaFX in Clojure.
                This is meant to be used with Java 8.
                ..."
  :url "https://www.github.com/zilti/clojurefx" ; my project is essentially forked from this project
  :lein-release {:deploy-via :clojars}
  :license {:name "Eclipse Public License"
            :url "http://www.eclipse.org/legal/epl-v10.html"}
  :dependencies [[org.clojure/clojure "1.5.1"]]
  :plugins [[lein-marginalia "0.7.1"]
            ...]
  :profiles {:dev {:dependencies [[midje "1.6-beta1"]]}}
  :main clojurefx.arg.splashpage
  :aot [clojurefx.arg.splashpage])

関数が存在する場所は次の-mainとおりです。

(ns clojurefx.arg.splashpage
  (:require
    [clojure.reflect :as clj-r]
    [clojure.stacktrace :as stacktrace]
    [clojurefx.arg.core :as core]
    [clojurefx.arg.core :refer [deffx]]
    ...)
  (:import
    (javafx.scene.text Font FontPosture FontWeight Text)
    ...)
  (:gen-class))

(defn -main [& args]
  (println "Up and running! The arguments supplied were: " args))

;=====JavaFX visual objects initialized and displayed with the code below=====
;-----Root-----
(deffx rt group)
;-----Scene/Window-----
(deffx scn scene
  :width 600
  :height 600
  :root rt
  :fill (. Color BLACK))
;-----Stage/Window-surround-----
(deffx stg stage
  :title "Colorful Circles"
...
(dofx (.show stg)) ; shows the JavaFX window with the circle animation
(dofx (.play tmln)) ; play 40s of animation

先ほど言ったように、アニメーションは 40 秒間正常に再生されますが、その時点で次の例外が発生します。

-> Exception in thread "main" java.lang.ExceptionInInitializerError
->   at clojure.main.main(main.java:37)
     ... ; a long list of traced errors
-> Caused by: java.lang.IllegalStateException: Toolkit not initialized
     ... ; a long list of traced errors
-> Exception in thread "Thread-4" clojure.lang.ExceptionInfo: Subprocess failed {:exit-code 1}
     ... ; a long list of traced errors
->   at java.lang.Thread.run(Thread.java:724)

JavaFX スレッドの動作に関係があるのではないかと考えています。アニメーションの実行が停止すると、何らかのタイムアウトが発生する可能性があります。比較すると、main clojurefx.arg.splashpageandをコメントアウトして、ファイルからコードを手動でコピー、貼り付け、評価して REPL にする場合、タイムアウトは発生しません。また、JavaFX オブジェクトの初期化と表示のコードを関数に入れると、たとえば、関数が明示的に呼び出されるまで実行時にコードが評価されないようにすると、JVM が起動された直後に「タイムアウト」が開始されます。そして関数が呼び出されます。:aot [clojurefx.arg.splashpage])project.cljsplashpage.clj(init-stage)(-main)

考え?Clojure を知っている人々の集合と JavaFX 8 を知っている人々の集合が交差する部分は、信じられないほど小さいことに気付きました...

追加情報:

関連する別の問題があります。.jar ファイルをデプロイしようとすると、次のようにファイルが正常に作成されます。

Alexanders-MacBook-Pro:cljfx-arg alexandergunnarson$ lein uberjar
Compiling clojurefx.arg.splashpage
Created /Users/alexandergunnarson/.lein/cljfx-arg/target/arg-0.0.10-SNAPSHOT.jar
Created /Users/alexandergunnarson/.lein/cljfx-arg/target/arg-0.0.10-SNAPSHOT-standalone.jar

しかし、Mac (スタンドアロンかどうかに関係なく) で .jar を実行すると、OS X は「ファイルを起動できません」と表示します。また、.jar が実際に作成されるポイントは、アニメーションが停止するか、アニメーションmainを表示しているアプリ (JVM) を終了するポイントです。

4

1 に答える 1

0

これに対する答えは、特定の JavaFX クラスをインポートするには、以下を呼び出す必要があるということです。

(defonce force-toolkit-init (javafx.embed.swing.JFXPanel.))

defonceツールキットが再初期化されないようにするために使用されます。

JavaFX クラスをインポートする前であっても、これを宣言することをお勧めします。

于 2014-08-24T02:54:30.363 に答える