Compiler APIを使ってみる
まだやる気がある。勢いで書く。
作成中のウィジェットマネージャは、ユーザが書いたMXMLをSWFにビルドしなくちゃいけないので、その為にFlex SDKに含まれるCompiler APIを使う。
ちなみにCompiler APIのJavaDocはここからダウンロード可能。
# 他に方法、あるのかな?あったら教えてください
使い方は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 APIのJavaDocが見つけられなかったので(なんと調査力の無い…)、PDFに書いてあるメソッドしか使ってないけど、
もしかしたら、もっと効率のいいやり方があるのかもしれない。さらに言うとAIRアプリビルド時の設定周りは怪しいかもしれん。
あとこっちのサイトには、メモリ上のMXMLをビルドしてSWCを出力する具体例が載っているんで、参考にどうぞ。
(追記)
ソースコード中のコメントのせいで、スクロールバーが出て見づらくなってたので、
コメントを多少変更した