この記事は、JavaFX Advent Calendar 2015 の 24 日目の記事です。
昨日は id:kozake (@s_kozake) さんの 「続・AndroidでJavaFXを動かしてみたよ!」 でした。
明日は id:skrb (@skrb) さんがトリを飾られます(^^)!!
今年1年を振り返ってみると、技術的に新しいものを探したり・触ったりする余裕がない1年でした。逆に言えば真面目に仕事をしていたというか(^^;
そんなわけで、残念ながらJavaFXに関してもあまり新しいネタはありません。(すみません…
ということで、今日は実際の仕事でJavaFXをこんな風に使ってみた、というネタにしたいと思います。
現場 x JavaFX
ちょうど昨日のJavaFX Adventでこざけさんが「JavaFXは僕の好きな技術ですが、イマイチ現場で使われている感がありません。」と書かれていました(^^;
皆さんの現場ではどうでしょう(^^;?
ちなみに自分の所(部門)では、デスクトップアプリを作る際はWindows FormやWPFといった.NET技術を使っています(C#)
JavaFXは存在は知っているものの(多分…)、最終的には使い慣れた技術のほうが実案件で選ばれるのは仕方がない…という所でしょうか(^^;
元々Windows系が多いので、あえてJavaFXを選択するラインがないです。
また、会社全体でみると、同様に.NET系が多いようですが、Javaの場合だと、やっぱりSwingが主力みたいなところは普通にあるようです。
仮配属にきた新人さんへJavaFXを少し触ってもらったのですが、本配属先ではSwingでした、というのが今年はありました。
テストドライバ x JavaFX
実案件は難しいけど、脇で使ったり、直接お客さんが触るものでない所でJavaFXを…と思って1年くらい経つのですが、少し前にちょうどいい感じの仕事が出てきました。
その仕事は、Salesforceと連携して使う、とあるWebシステム構築案件です。
Salesforceをご存じの方はわかると思いますが、Salesforceは非常にカスタマイズ性が高く、Apexという言語で画面作ったり、ボタンで複雑な処理を呼び出したり、色々なことができます。
うちは導入ベンダなどではないので、Salesforce部分は専門ベンダさんが構築で、うちが作るWebと連携する形です。
当初連携ではSalesforceのRESTを使おうとしてましたが、最終的にはSOAPを使っています(詳細は以下エントリ)
kikutaro777.hatenablog.com
実際やってみるとSOAP使った連携は楽だよなぁと。SFDCのWSDLからクラス自動生成できますし。
さて、本題です。
今回のシステムでは、Salesforce側でうちのWeb画面を呼び出す前に色々とオブジェクトを操作する流れがあります。その後、うちのシステム側に情報が来て、加工して、SOAP APIで更新する、みたいな。更新するには先にSaleforceのロジックでオブジェクトが作成されていないといけない、などですね。
連携とかの開発ではよくある話だと思いますが、両社の開発過程では、まだ色々出揃ってないのでドライバやスタブなどが必要となります。
ドライバやスタブがわからない場合は情報処理試験の本以下ページにある図などがイメージしやすいかと。
What is the difference between stubs and drivers in software testing? - Quora
実際Salesforce上のApexなどでドライバが作れれば最高なわけですが、今回は期間的にもドライバを相手方に作ってもらう時間や、うちがApexを習得して自前でドライバを作る余裕はありませんでした。
なので、Javaで普通にSOAP APIを叩いて、Salesforce上で何かの操作をした後のオブジェクト構造とかを作り出すドライバを作りました。
せっかくなので、JavaFXで作って、ドライバで作ったデータをすぐ確認できるように、WebViewもつけてます。以下のような感じ。
ドライバでテストデータを作って、ブラウザ使わずともWebViewでみれたり。
現場への導入第一歩としては良い感じではないかなーと(^^;
JavaFX使うと何がどこまでできるのか、とかも徐々にナレッジが溜まりそうですし。
書いてるコード
このプロジェクトで作ってるドライバは、非常に簡単なコードの集まりです(^^;
以下に、明日トリを飾る@skrbさんが以前JJUGでハンズオンをされたときの資料がありますが、これを1回やれば普通にできるレベルです。
上記ハンズオン資料は非常に細かく手順も書かれているので、新人さんでも普通にこなせます。
実際、プログラミング経験がほとんどない新人さんにやってもらったりもしてるので。
NetBeansでunpackingが遅い
ドライバ作ってるときにちょっと出会ったネタを最後に1つだけ。
自分はNetBeansでMavenを利用してJavaFXアプリを作っています。画面はSceneBuilderで。
で、今回のドライバはSalesforceのライブラリを使ったり、その他、諸々と依存性があったのですが
ビルドが超遅い(^^;
コンソールみると
unpackingをすごいしています。調べると、java -jarで実行可能なjarファイルを作ってくれてて、そのために依存ライブラリをいれてるっぽい。
で、以下に同じ話がありました。
stackoverflow.com
上記StackOverflowにあった解決案としてprofileを作成するというのがあって、自分はそうしました。
NetBeans(ちなみに8.0.2) & Mavenで自動作成されたpom.xmlには
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>exec-maven-plugin</artifactId>
<version>1.2.1</version>
<executions>
<execution>
<id>unpack-dependencies</id>
<phase>package</phase>
<goals>
<goal>exec</goal>
</goals>
<configuration>
<executable>${java.home}/../bin/javafxpackager</executable>
<arguments>
<argument>-createjar</argument>
<argument>-nocss2bin</argument>
<argument>-appclass</argument>
<argument>${mainClass}</argument>
<argument>-srcdir</argument>
<argument>${project.build.directory}/classes</argument>
<argument>-outdir</argument>
<argument>${project.build.directory}</argument>
<argument>-outfile</argument>
<argument>${project.build.finalName}.jar</argument>
</arguments>
</configuration>
</execution>
<execution>
<id>default-cli</id>
<goals>
<goal>exec</goal>
</goals>
<configuration>
<executable>${java.home}/bin/java</executable>
<commandlineArgs>${runfx.args}</commandlineArgs>
</configuration>
</execution>
</executions>
</plugin>
のような定義があるので、これを
<profiles>
<profile>
<id>executable</id>
<build>
<plugins>
<plugin>
</plugin>
</plugins>
</build>
</profile>
</profiles>
これで、通常ビルドではunpackingせずに、実行可能なjarを作成したいときは以下プロファイルを指定してビルドすればいいような形になりました。
明日は@skrbさんがトリを飾られます(^^)!!!