2011年10月17日月曜日

mavenでAIRする

はじめに

今回は、flexmojos-maven-pluginでFlex-AIRアプリを作ろう!というのがテーマです。
このMavenプラグインを使ってうれしいことは
  1. 無償である。
  2. MavenリポジトリにアップされているFlex-SDKを利用できるのでダウンロード、インストールなどが不要である。
などなどです。
それでは、Getting Started!!

環境

OS Windows XP
ビルドツール Maven 3.0.3 ※mvnコマンドが実行できるように設定しておきます。

作業フォルダ作成

とりあえずCドライブ直下にプロジェクトフォルダを作成します。
コマンドプロンプトを開いて以下のコマンドを実行します。
cd c:\
mkdir maven-air
cd maven-air
作成した作業フォルダ作成に移動しておきます。

pom.xmlファイルを作る

コマンドプロンプトから以下のコマンドを実行します。
mvn archetype:generate ^
-DarchetypeRepository=http://repository.sonatype.org/content/groups/flexgroup ^
-DarchetypeGroupId=org.sonatype.flexmojos ^
-DarchetypeArtifactId=flexmojos-archetypes-application ^
-DarchetypeVersion=4.0-beta-3
archetypeVersionについて
現時点での最新と思われる 4.0-beta-3 を指定します。
groupId、artifactId、versionは以下のようにします。

groupId mydomain.com
artifactId my-air
version 1.0-SNAPSHOT

コマンド実行後、プロジェクトフォルダとpomファイルが生成されます。
次に生成されたpomファイルを以下のような感じで編集します。
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
     
  <modelVersion>4.0.0</modelVersion>

  <groupId>mydomain.com</groupId>
  <artifactId>my-air</artifactId>
  1.0-SNAPSHOT
  swf

  my-air Flex

  
    Main
    4.5.0.17855
    ${basedir}/src/main/resources/sign.p12
    geheim
  
  
  
    <sourceDirectory>src/main/flex</sourceDirectory>
    <testSourceDirectory>src/test/flex</testSourceDirectory>
     
      
        <groupId>org.sonatype.flexmojos</groupId>
        <artifactId>flexmojos-maven-plugin</artifactId>
        4.0-beta-3
        true
        
          <flexBuilderCompatibility>true</flexBuilderCompatibility>
          <sourceFile>${application.name}.mxml</sourceFile>
          <descriptorTemplate>${basedir}/src/main/flex/${application.name}-app.xml</descriptorTemplate>
          ${keystore.file}
          ${keystore.password}
          <includeFileSets>
            <fileSet>
              src/main/resources/embedded
              
                *.*
              
            </fileSet>
          </includeFileSets>
        
        
          
            
              sign-air
            
          
        
      
    
  

  
    
      <groupId>com.adobe.flex.framework</groupId>
      <artifactId>flex-framework</artifactId>
      ${flex.framework.version}
      pom
    
    
      <groupId>com.adobe.flexunit</groupId>
      <artifactId>flexunit</artifactId>
      0.85
      swc
      test
    
    
      <groupId>com.adobe.flex.framework</groupId>
      <artifactId>air-framework</artifactId>
      ${flex.framework.version}
      pom
    
    
      <groupId>com.adobe.flex</groupId>
      <artifactId>compiler</artifactId>
      ${flex.framework.version}
      pom
    
    
      <groupId>com.adobe.flex.compiler</groupId>
      <artifactId>adt</artifactId>
      ${flex.framework.version}
    
  

  
    
      flexmojos
      http://repository.sonatype.org/content/groups/flexgroup
    
  

  <pluginRepositories>
    <pluginRepository>
      flexmojos
      http://repository.sonatype.org/content/groups/flexgroup
    </pluginRepository>
  </pluginRepositories>
 
  
    
      createCertificateKey
      
        
          ${basedir}/src/main/resources/sign.p12
        
      
      
        
          
            <groupId>org.codehaus.mojo</groupId>
            <artifactId>exec-maven-plugin</artifactId>
            1.1.1        
            
              
                generate-cert
                generate-resources
                
                  exec
                
                  
                    java
                    <workingDirectory>${basedir}/src/main/resources</workingDirectory>
                    
                      -classpath
                      <classpath/>
                      com.adobe.air.ADT
                      -certificate
                      -cn
                      AirPackage
                      2048-RSA
                      sign.p12
                      geheim
                    
                  
              
            
          
        
      
    
  
 
</project>
CertificateKeyファイルについて
ビルドの度にCertificateKeyファイルを作ってAIRパッケージするとAIRインストール時にエラーが出る。
なのでprofile設定を利用してCertificateKeyファイルが無い時にだけ生成するようにします。
(同じCertificateKeyファイルを使ってパッケージしないといけないようだ)
sign-airゴールの設定をうまくやればこのprofile設定は不要かもしれません。
わたしはよく分からなかったのでexec-maven-pluginでCertificateKeyファイルを生成する方法にしました。

テンプレートファイル作成

AIRパッケージのためのテンプレートファイル作成します。
ファイル名は 『Main-app.xml』 として、『c:\maven-air\my-air\src\main\flex』 フォルダに置きます。

Main-app.xml
<?xml version="1.0" encoding="UTF-8"?>

  com.mydomain.MyApp
  Main
  My Application
  1.0
  <initialWindow>
    my-air-1.0-SNAPSHOT.swf
    true
    800
    600
  </initialWindow>


プロジェクト構成の確認

確認の前に embedded フォルダを作成します。
コマンドプロンプトを開いて以下のコマンドを実行します。
 
mkdir C:\maven-air\my-air\src\main\resources\embedded
 
この時点で以下のようなファイル構成になっているか確認します。
  • C:\maven-air
    • my-air
      • src
        • main
          • flex
            • Main.mxml
            • Main-app.xml
          • resources
            • embedded
        • test
          • flex
            • mydomain
              • com
                • TestApp.as
      • pom.xml
sign-airゴールについて
embedded フォルダを作るのを忘れるとビルドの時のsign-airゴール実行に
NullPointerExceptionが出るので気をつけましょう。

ビルド!!

いよいよビルドの瞬間がやって参りました。
うまくいきますかねぇ?
ドキドキしますね!
それでは pom.xml ファイルのあるプロジェクトフォルダに移動してコマンドプロンプトから以下のコマンドを実行!!!
cd c:\maven-air\my-air
mvn clean package -Dmaven.test.skip=true
ここに来て残念なお知らせが・・・
テスト実行時、 Flash Playerか見つからない等のエラーが出てしまいます。
(わたしの環境だけなのかもしれませんが・・・)
PATH変数やmvnコマンドの引数にFlashPlayer.exeを使いしてみたりしたのですがうまくいきませんでした。
なので今回、テストは見送りです。
わたしの設定の仕方が間違っているのか、プラグインがおかしいのかよく分かりません。
まぁオープンソースなのでそんなものです。
いつかソースコードを眺めてみたいと思っています。
コマンド実行後、targetフォルダ直下に my-air-1.0-SNAPSHOT.air ファイルが出力されます。
このファイルをダブルクリックするとAIRインストーラーが起動します。
あとは適当にインスールするフォルダを選択して完了です。
AIRアプリのインストールに失敗する場合
同じAIRアプリを違うCertificateKeyファイルでパッケージするができないようです。
そんな時は、コントロールパネルの『プログラムの追加と削除』から一旦AIRアプリを削除してから
再度my-air-1.0-SNAPSHOT.air ファイルを実行してみよう。

おわりに

とりあえずは、無償でFlex-AIRアプリがそこそこお手軽に作れる環境が整ったとは思いますが
いくつか問題点は残りました。(テストなど)
ここがFlashBuilderを購入するか悩むところです。
仕事ならばFlashBuilder購入なのでしょうが
趣味程度ならflexmojos-maven-pluginで十分なのでしょうかね?
むむ~
flexmojos-maven-pluginのソース読む元気ないし
FlashBuilderの安いものなら3万円くらいなので買おうかしら?

参考URL
http://blog.flex-mojos.info/
http://flexmojos.sonatype.org/getting-started.html
https://docs.sonatype.org/display/FLEXMOJOS/Home
https://docs.sonatype.org/display/FLEXMOJOS/Building+an+AIR+Application
https://repository.sonatype.org/content/sites/maven-sites/flexmojos/latest/plugin-info.html
http://code.google.com/p/jianwikis/wiki/MavenForFlexAirProject#Flex_AIR_Maven_Project