basilisk-fw について試食した雑感

F0000;">この記事は、JavaFX Advent Calendar 2015 - Qiita の 15 日目の記事です。

basilisk-fw ってなんぞや? って方も多いと思います。

Java Champion で griffon を作られている aalmirayさんが新規立ち上げたプロジェクトです。

現時点では griffonとほぼおなじものらしいのですが、
今後はJavaFX専用に特化していこうみたいなプロジェクト。

まあここらへんの事情は
griffon-fw 自体が

  • 未だにSwingBuilder等でSwingのサポートをしていたり
  • 他のPluginがverupの時に動かなくなって相互影響が出やすい

等の状況で色々と引きずられやすいからでしょうね。

でもまあtwitterだと
griffon や basilisk みたいなアカウントやハッシュタグ等 が結構あってググりビリティが悪いので
情報収集がgrails等より大変で不遇だなーと思いながら見てたりしてます。。



実際に

チュートリアルを触ってみた感想など

事前準備編)

チュートリアルベースであれば

  • lazybone
  • java8
  • java6 or java7
    • org.javafxports:jfxmobile-plugin のretrolambdaに依存

が必要になります

上記のチュートリアルだと

  • SDKManが下記のソフト必須のように書いていますが、
    • lazybones
    • gradle

に記載があるように 0.8.1
から直接バイナリをダウンロードしてきて
bin/lib をPATHに通せば,lazybone自体は Windowでも使うことが出来ます.

gradle自体も、実はgradlew warperが生成されているのでいりません*1

■jfxmobile-plugin 単体に関して

ぐらいしか情報出てこないかな。。(汗

このpluginは

  • robovm+retorolamdaを下回りに使ってる。
    • javafx=>apk/ipa 等の変換に使ってるとpluginの公式ページに記述有り

javafxports / javafxmobile-plugin / source / — Bitbucketのソースを読むと
apk生成は minsdk4/combile sdk21のものを作成する感じ
android gradle pluginは1.1.0の物をクラス継承して使っててちょっと古めかな。。




実行編)
とりあえずチュートリアルを進めていきます

> lazybones create basilisk-javafx-ios sample

この直後状態のままだと動かないので修正を加えます。*2

  • build.gradle
retrolambda {
	if(macosx){
	    jdk '/usr/libexec/java_home -v 1.8'.execute().text
    	    oldJdk '/usr/libexec/java_home -v 1.7'.execute().text
	}
	else{
            //Linuxとかであればgradle.propertiesから参照
	    jdk System.properties['JAVA8_HOME']
	    oldJdk System.properties['JAVA7_HOME']
	}
	javaVersion JavaVersion.VERSION_1_7
} 
  • gradle.properties
group = org.example
version = 0.1.0-SNAPSHOT
groovyVersion=2.4.4
spockVersion=1.0-groovy-2.4

org.gradle.daemon=true
org.gradle.parallel=true
org.gradle.configureondemand=true
org.gradle.jvmargs=-Xmx512m -XX:MaxPermSize=512m -Dfile.encoding=UTF-8 -Dgroovy.source.encoding=UTF-8
org.gradle.workers.max=4

# window/linux とかの場合
org.gradle.java.home=/opt/jdk8
systemProp.JAVA8_HOME=/opt/jdk8
systemProp.JAVA7_HOME=/opt/jdk7
systemProp.ANDROID_HOME=/opt/android-sdks
  • gradle/wrapper/gradle-wrapper.properties
    • 最新のgradleを使うように修正
distributionUrl=https\://services.gradle.org/distributions/gradle-2.9-bin.zip

でもこの状態でも
> gradlew build

はコケてしまいますので

> gradlew build -x checkMain -x test

で実行します。

によるとtemplateが治ってるそうですが、まだjcenterにリリースされていない状態のよう


ビルド完了後
> gradlew run

で通常のJavaFXとしては実行できます。

その後
> gradlew launchIPhoneSimulator

をすると、依存ライブラリをかなりの時間かけて落としてきてやっと
iPhoneSimulatorで 実行されるみたいな状況になります。。。


考察編)

jfxmobile-plugin はandroidの対応が出来るはずなので
試してみましたが解決できず質問中。

理由的には、

  1. groovy =>java=>dex ではなく
  2. groovy =>dex
    1. issueの回答見たらretorolamdaがinvokeDynamicを使ってるコードを変換できないので無理とのこと><

やろうとして出来無いからだと思うけど。。(汗

ちなみにこのチュートリアルのlazyboneのテンプレートWindowsでは動きません><。

理由は jfxmobile-plugin が

  • iphoneの実行環境チェックtaskでwindowsだとコケる
    • gradlew taskのレベルで
  • robovmのビルドが基本公式でもmac専用を歌ってる
    • 一応windowsでもbuildだけはできたみたいな話はStackOverFlowに出てくるんですけどね(汗

の大本のサンプルレベルでwinだと gradlew tasks できなかったですし・・

ここらへんコメントにすると
> gradlew build
> gradlew run
で普通に実行はできるのでノーマルプロジェクトのテンプレートは欲しかったかなーと

環境に依存しない実行できるものであれば

辺りをコピーしてきて弄る形のほうが楽になってしまう。。

まあこの手のモバイル対応*3って

  • iPhoneだと「スゲーw」
  • Androidだと「ふーん。それが?」

って話になるので対応が後手に回るのは仕方ないのかなーとか考えていたりも・・(苦笑


winサポートの話をするなら
チュートリアルのテンプレートで記述されてる

  • grdlew lzpack
  • grdlew idea

のタスク対応を説明記載しても良かったのではないかと思う*4

まあデスクトップアプリ主力にすると

  • リリース時にjnlpあたりの話でまず詰まる*5

ので、そこら辺を簡易にしないと業務リリース向けはやはり難しいのかな−
とか色々と考えてしまうことが有りますが。。

*1:ただしgithubのcommitを見ると最新のver参照に変更する方が良いようです

*2:jfxmobile-pluginの環境にモロ依存><

*3:とくにデモレベルだと

*4:ココらへんは実はgriffonのtemplateあたりの情報を継承してるのかもしれませんが。。。

*5:自分も以前griffon-fwレベルでどう書くのか凄く苦しんだ覚えが・・Java有識者レベルでは常識なのかもしれませんが。。