Compiler APIを使ってみる

まだやる気がある。勢いで書く。


作成中のウィジェットマネージャは、ユーザが書いたMXMLをSWFにビルドしなくちゃいけないので、その為にFlex SDKに含まれるCompiler APIを使う。
ちなみにCompiler APIJavaDocここからダウンロード可能。
# 他に方法、あるのかな?あったら教えてください


使い方はAdobeさんが公開しているPDFを読めば、普通にやることは書いてある。あれが全てです。
なので、本当はわざわざ書くこともないんだけど、ただ他に書くネタがあまりにもないので、
今回のアプリで実際にどういう手順でメソッドを実行したか、を書いてみることにした。
# あくまで、今回のアプリの処理手順ですので、Adobeの推奨手順かどうかわかりません。晒す事で間違いを見つけてもらって指摘をもらう、という目的もw

public boolean compileMXML(
        String flexSdkPath,         // Flex SDKディレクトリの絶対パス文字列
                                    // (Flex SDKのflex-sdk-description.xmlがあるディレクトリ)
        String mxmlPath,            // MXMLファイルの絶対パス文字列
        String swfPath,             // SWFファイルの絶対パス文字列
        File[] flexLibs,            // ビルド時に使用するSWCファイルを示すFileクラスの配列
        String licenseKey           // Flex Builder 3 Proのライセンスキー文字列
) {
    File mxmlFile;              // MXMLファイルを示すFileクラス
    File swfFile;               // 生成するSWFファイルを示すFileクラス
    File airConfigXML;          // Adobe AIR用のビルド設定ファイルを示すFileクラス

    Application application;    // MXMLからSWFにビルドするApplicationクラス
    Configuration configuration;// ビルド設定を格納するConfigurationクラス

    mxmlFile = new File(mxmlPath);
    swfFile = new File(swfPath );

    // Applicationクラスのコンストラクタには、MXMLファイルが必要っぽい
    // Applicationクラスの再利用はできない?
    application = new Application(mxmlFile);

    // 以下は、ビルド処理の進捗を見たい場合荷追加する処理
    // 下の例で引数に指定しているflex2.tools.oem.internal.OEMProgressMeterは、
    // 進捗度合い(%表記)を標準出力に出すだけのクラス
    // 自分でflex2.tools.oem.ProgressMeterインターフェースの実装クラスを作れば、
    // 別の出力方法に変更可
    application.setProgressMeter(new flex2.tools.oem.internal.OEMProgressMeter());

    // デフォルトのビルド設定を取得する
    // 以降、ビルド設定はConfigurationクラスのメソッドを使って設定する
    Configuration configuration = application.getDefaultConfiguration();

    // 第一引数の"flexlib"は固定(たぶん)
    // 第二引数でFlexのライブラリがある場所を指定する
    // libsディレクトリがある場所?flex-config.xmlがある場所?
    // どっちで判断してるかわかりませんorz
    configuration.setToken("flexlib", flexSdkPath + "\\frameworks");

    // 以下は、AIRアプリ(WindowedApplicationとか)をビルドする場合に追加する処理
    airConfigXML = new File(flexSdkPath + "\\frameworks\\air-config.xml");
    configuration.addConfiguration(airConfigXML);

    // 以下は、ビルド時に外部のSWCファイルを使う場合に追加する処理
    // まずはFile型配列の長さをチェック
    if (flexlibFiles.length > 0) { 
        // 長さが1以上ならそのまま追加
        configuration.addLibraryPath(flexlibFiles);
    }
    // Chartコンポーネントの透かし解除など、
    // Flex Builder Professionalの機能を使いたければ、
    // 第二引数でライセンス文字列を指定する
    // ちなみに第一引数の"flexbuilder3"は固定(たぶん)
    configuration.setLicense("flexbuilder3", licenseKey);

    // イロイロ設定したConfigurationクラスを
    // Applicationに設定しなおす
    application.setConfiguration(configuration);

    // 出力するSWFを指定する(いつやってもいいのかな?)
    application.setOutput(swfFile);

    // ビルド開始
    return (application.build(true) > 0)
          ? true /* ビルド成功 */
          : false; /* ビルド失敗 */
}

これを書いた当時、Compiler APIJavaDocが見つけられなかったので(なんと調査力の無い…)、PDFに書いてあるメソッドしか使ってないけど、
もしかしたら、もっと効率のいいやり方があるのかもしれない。さらに言うとAIRアプリビルド時の設定周りは怪しいかもしれん。


あとこっちのサイトには、メモリ上のMXMLをビルドしてSWCを出力する具体例が載っているんで、参考にどうぞ。


(追記)
ソースコード中のコメントのせいで、スクロールバーが出て見づらくなってたので、
コメントを多少変更した