BlazeDS 4.7.1をビルドしてみる

おひさしぶりですこんばんは。
3か月ぶりの更新になったわけですが、今回はBlazeDSをソースからBuildしようと思います。

半月ほど前の8月半ばにBlazeDSの脆弱性(CVE-2015-3269)が報告されました。Adobe LiveCycle Data Servicesを使用している場合は公式サイトのPatchを取り込めばよいですが、そうでない場合はBuildするかMavenに登録されているJarを取り込むかのいずれかになります。
ただ、BlazeDSはOSSであり、現在はApacheで管理・運営されているのですが、他のApache系プロジェクトと比べると使用者にはあまりやさしい作りにはなっていません。
例えば、現時点(2015/09/04)では公式サイトでリリースしているのは4.7.0のみで対策版はMavenからのみだったり、MavenのものもJava 1.8が前提だったりします。1)

前々からBlazeDSの自前コンパイルに興味はあったのでこれを機会に簡単に纏めようと思います。
纏めるといってもやったことを淡々とコピペになりますけどね^_^;
やったことはREADMEに書いてある通りです。なわけで、この記事自体はおさらいです。

git repositryからソースを取得

適当な場所にgit repositoryからソースを取得。
取得するのはこの3つ。

  •  flex-sdk
  •  flex-tlf
  •  flex-blazeds

apache flexの各種Repositoryについてはここで参照可能。

先に書いておけばよかったですが、今回のディレクトリはだいたい以下の構成で行います。

  •  E:\FlexBuild : 作業用ディレクトリ
  •  .\src : gitからcloneするディレクトリ

あと、環境はWindows 8.1ですがLinuxでもやることはさほど変わらないので適当に読み替えてください。

まずはclone。

次にflex-sdkとflex-blazedsは特定のTagでCheckout。

現時点ではsdkは4.14.1が最新なのでtag「apache-flex-sdk-4.14.1」でcheckout。同様ににblazedsは「blazeds-4.7.1」。

余談ですが、BlazeDSの対策は4.8.0のBranchで行われています。対策は1つだけだしそれように準備するのも煩わしかったのかな?

環境変数及びBuildに必要なファイルの取得

ソースを取得したところで必要なバイナリと環境変数を設定します。

# 変数 説明
1 JAVA_HOME 使用するJava SDKのインストールディレクトリを指定。1.7を使用しました。
2 ANT_HOME 使用するAntのインストールディレクトリを指定。1.9.2を使用しました。
3 AIR_HOME Adobe AIR Integration Kitのインストールディレクトリを指定。
4 PLAYERGLOBAL_HOME Adobe Flash Player playerglobal swcを格納したディレクトリを指定。ディレクトリ構成があるので後で詳細を書きます。
5 FLEX_HOME Flex SDKのインストールディレクトリを指定。指定しなくてもBuildできました。flex-blazedsと同階層にあるflex-sdkが指定されいるように見える。
6 FLASHPLAYER_DEBUGGER Adobe Flash Player Content Debugger。指定しなくてもBuildできました。
「C:\MyPath\FlashPlayerDebugger.exe」のようにexeまで指定するみたいです。
7 path 既存のpathに対してJava及びAntのbinを追加する。
e.g. set path=%ANT_HOME%\bin;%JAVA_HOME%\bin;%path%

Adobe AIRやPlayglobal、Flashplayer Debuggerの取得先はREADMEに記載があります。
READMEはflex-blazeds\READMEです。

JavaとAntはすでに入っている前提で話を進めていますが、まだ持っていない場合は取得してください。

playerglobalについて

PLAYERGLOBAL_HOMEについてですが、READMEにはディレクトリ構成を以下のようにすると書いてあります。

この場合、PLAYERGLOBAL_HOMEはplayerディレクトリを指定します。
playerglobalは10.2から13.0まで14ファイルあります。全部作るのは面倒なので必要なもののみを用意すればよいでしょう。
初期状態では11.1です。これはflex-sdkのbuild.propertiesにあるplyerglobal.versionで指定されています。

というわけで11.1以外を指定したい場合はflex-sdkのbuild.propertiesに記載されている内容を変更すればOKです。
他の変更方法ではflex-config.xmlやらコンパイル時の変数で指定する等々ありますが他の方法についてはREADMEを参照してください。

buildを実行

flex-sdkのbuild

flex-sdkでantを実行します。が、現時点(2015/09/04)でのビルドファイルではライブラリの取得で失敗します。

apache.orgの仕様が変わったのかわかりませんが、動的にMirrorサイトを取得することができないようです。
というわけでpreferredに入るべきサイトを先に調べてプロパティで指定します。

まずは「http://www.apache.org/dyn/mirrors/mirrors.cgi/flex/pixelbender/1.0/binaries/apache-flex-sdk-pixel-bender-1.0.0-bin.zip」にブラウザでアクセス。
表示したページでsuggestされたサイトをコピーし、ant実行時に指定します。
asjson=trueなURLからはサイトを取得できませんが、実行時に指定したpreferredを使用してライブラリを取得します。

途中でembedded fontについて聞かれます。そのままEnterで問題ありません。
欲しい場合は表示されている情報を読みましょう。

Buildが継続され、しばらくすると終了します。

flex-blazedsのbuild

flex-blazedsでantを実行します。

FLEX_HOMEを設定していない場合は以下のようにFLEX_HOMEを設定してくれます。

環境変数をチェックし、
ディレクトリ等々をCleanし、
Thirdpartyライブラリをダウンロードし…
と続いていきます。

Thirdpartyライブラリ、いわゆるOSSですが、結構な量があるのでここで時間がかかります。
現時点(2015/09/04)時点のビルドファイルではjacksonの取得に失敗します。

どうやらrepository.codehaus.orgがみつからないらしいので、別のところからjackson-core-asl-1.0.0.jarを取得するように修正しましょう。
ここは無難にMavenのCentral Repositoryから取得します。
修正するファイルはdownload.xmlです。

気を取り直してもう一度antを実行。
Downloadが成功しているAntのTaskについてはほぼすっ飛ばしです。

Downloadが終わるとコンパイル等の処理が開始されます。
しばらくするとBuildが終了します。

41秒で完了していますがこれはライブラリのDownload時間を除いた時間です。

flex-sdkをbuildしていない場合

もし、FLEX_HOMEを未指定、もしくはflex-sdkをにしており、flex-sdkをbuildしていない場合は以下のエラーでBuildが失敗します。
この場合は先にflex-sdkをBuildしておきましょう。

できたもの

flex-blazeds\libに他のOSSとともに入っています。flex-messaging-*.jarがそれですね。
これで晴れてBlazeDSをソースからコンパイルできました。
気になるところをいくつか挙げておきます。

前提ライブラリ

私が知っている頃のBlazeDSははるか昔なのですが、そのころに比べると依存しているライブラリが増えたりバージョンが変わっていたりします。
とりあえずBuildしたもののどれがあれば動くのかな?という状態です。
flex-messaging-coreのpom.xmlをみるとActiveMQがprovidedになっていることから、実行環境に入っていることが期待されているわけですよね?

Manifestファイル

flex-messaging-core.jarのMANIFEST.MFを見ています。

何も考えずにBuildするぐらいならどうでもよいのですが…うーむ。
Versionは4.7.1にするべきだし、VendorももはやAdobeではないよな。

Versionなどの値はflex-blazeds\build.propertiesの一番下にあります。

前提ライブラリ等まだ書くことがあるのですが、Buildに関してはこれで終わりです。

Footnotes
  1. Adobe LiveCycle Data Servicesの対策版はJava 1.5 でBuildされていますね。 []