リッチインターネットアプリケーションと
 Macromedia Flex の技術情報集
 
    HOME   |  
 
 
 Flex FAQ プレゼンテーションサーバーに関する質問

質問一覧

  1. コンパイルされた swf をファイルとして出力することは可能ですか? 生成された swf ファイルを別のサーバーにコピーし、配布することは可能ですか?
  2. 32K をオーバーしているというメッセージが出力され mxml を実行することができません
  3. コマンドライン・コンパイルツール mxmlc / compc を bin ディレクトリ以外の場所で利用することができません。Error: could not find a JVM. というメッセージが出力されます
  4. HTTPService / WebService の SSL 通信ができません (NEW!)

 

質問と回答

質問:

コンパイルされた swf をファイルとして出力することは可能ですか? 生成された swf ファイルを別のサーバーにコピーし、配布することは可能ですか?

答え:

コンパイルされた swf をファイルとして出力することは可能です。 Flex の設定ファイル flex-config.xml ({Flexプレゼンテーションサーバーインストールディレクトリ}/WEB-INF/flex の中にあります)の <keep-generated-swfs> の値を <keep-generated-swfs>true</keep-generated-swfs> としてください。 MXML ファイルがコンパイルされると、MXMLと同じディレクトリに

{ファイル名}.swf  

というファイル名でSWFファイルが生成されます。このファイルは例えば、コンパイルされた swf のダウンロードサイズを知りたい場合などに便利です。なお、<keep-generated-swf> の設定は、<production-mode> が false でなければ有効にならないことをご注意下さい。<production-mode> が true のときは <keep-generated-swf> オプションは常に false として動作します。なお<production-mode> の初期設定値は false となっています。

生成された、swf ファイルを別の web サーバーにコピーし、クライアントに配布することはライセンス上許可されていません。MXML から生成される swf は Flex プレゼンテーションサーバーからのみ配布可能であるとお考えください。

 

 

質問:

32K をオーバーしているというメッセージ ( Error ... exceeds 32K span... ) が出力され mxml を実行することができません

答え:

"Branch between 14901 and 51166 around line 11 exceeds 32K span. If possible, please refactor this component" もしくは"Error /Foo-generated.as:280 Member function _foo_Foo is larger than 32K. If possible, please refactor this component." といったようなエラーメッセージが出力され MXML が実行できない場合があります。これは FlashPlayer のロードのメカニズムに起因して起こります。問題は一連の処理プログラムのサイズにあります。 FlashPlayer は 一連の処理プログラムのサイズが 32K バイトを超えるとき、これを一度に読み込み、実行することができません。エラーはこれが原因で発生します。 32K バイトの制限はアプリケーション全体のサイズ、つまりコンパイルされた swf のサイズに対するものではなく、アプリケーションが内部で持つ一つのファンクションに対する制限になります。一般に一つのファンクションが 500行以上の処理記述を持つ場合、この制限に引っかかる可能性があります。

このエラーでMXMLを実行できなかった場合次を検討してください

  1. 数百行におよぶ、非常に大きなファンクションは複数のファンクションに分割する。
  2. 一つの非常に大きなMXMLファイルとなった場合、その一部を一つの MXML コンポーネントとして切り出し、取り込むようにする。例えば TabNavigator などを使って複数のページを遷移するようなアプリケーションにおいて、各ページが一つのMXMLの中で定義されている場合は、一つ一つのページを 別々のカスタム MXML コンポーネントとして定義する。
  3. 大量のデータの初期化をMXML内部で行っている場合、別の初期化の方法を検討する。例えばデータグリッドに表示する500件の固定データを ActionScript で初期化している場合、これを <mx:Model source=" "> や <mx:XML source=" "> を用いて読み込むようにする、もしくは <mx:HTTPService> などを用いて動的に読み込むようにする。などを検討します。

なお、一つのファンクションのサイズが非常に大きい場合、Flexのコンパイラーは可能と判断される範囲でこれをいくつかのモジュールに分割し、swfの中に収めるという作業を行うようです。ですから必ずしもファンクションのサイズが大きいとこの制限に引っかかるというものでもありません。こっちでは500行超えても問題ないのに、こっちは問題あり、という状況になった場合、あまりその理由について深く考えないでください。500行を超えても問題がなかったほうは、コンパイラーが自動的に何とかしてくれたということです。一般に 一つのファンクションに数百行を超える処理の記述をおこなうことは Flex のアプリケーションでは推奨されません。

関連記事:

http://www.macromedia.com/cfusion/knowledgebase/index.cfm?id=tn_19520

 

 

質問:

コマンドライン・コンパイルツール mxmlc / compc を bin ディレクトリ以外の場所で利用することができません。Error: could not find a JVM. というメッセージが出力されます

答え:

mxmlc / compc プログラムが JVM を見つけることができないのが原因です。これらプログラムはどのようにして JVM をみつけるかというと、同じディレクトリにある jvm.config というファイルの java.home の設定を手がかりに見つけにいきます。ここの設定がデフォルトでは相対パス指定となっていたので、特定の場所からの実行でなければエラーとなりました。(Windows プラットフォームの場合)

mxmlc / compc プログラムを <Flexインストールディレクトリ >\bin ディレクトリ以外からも利用できるようにするためには次の作業を行います。

  1. システムの環境変数 PATH の設定に <Flexインストールディレクトリ >\bin を追加します。
  2. <flex インストールディレクトリ>\bin の中にある jvm.config ファイルをテキストエディタで開きます。(UNIX 改行コードのテキストファイルなので ノートバッドではなく、ワードバッドなどのテキストエディターで開くのが良いでしょう)
  3. jvm.config ファイルの 次の行を変更します。
    変更前:
    java.home=../UninstallerData/jre2    
    変更後:
    java.home=<flex インストールディレクトリ>/UninstallerData/jre2

 

質問:

HTTPService / WebService の SSL 通信ができません。

答え:

HTTPService、WebService タグを使ってサーバーと通信をするとき、Flex プレゼンテーションサーバーは、その通信の中継点(プロキシ)となります。 このため、SSL 通信でサーバーと通信をする場合、Flex プレゼンテーションサーバーは、SSL 通信の受け手となると同時にターゲットサーバーにアクセスをする送り手ともなります。 双方の観点で Flex プレゼンテーションサーバーが正しくセットアップされていなければ SSL 通信を行うことはできません。

●Flex プレゼンテーションサーバー、 SSL 通信のサーバー機能(受け手)の設定

SSL 通信のサーバー機能はJ2EE サーバーの機能がそのまま利用されます。通常、J2EE サーバーは IIS や Apache といった Webサーバーと連携させます。そしてこれら Webサーバー側に SSL 機能を持たせることで、SSLの通信機能は実現されます。 各J2EE サーバーでの SSL 機能の設定方法について詳細は各製品のマニュアルなどをご確認ください。

Flex を JRun 統合設定でインストールしたとき、Webサーバー機能は JRun 内蔵の Webサーバー機能(JWS) を利用しています。この WebサーバーにSSLを設定することは不可能ではないようですがかなり専門の知識が必要になります。 SSL 通信を実現するにあたっては Flex は何らかの J2EE サーバー上にデプロイ、この J2EE サーバーに SSL でアクセスできるよう設定を行うという方法をお勧めします。

この観点で設定が正しくされているかの確認方法:

.mxml を https://... の URLからアクセスして呼び出したとき、正しく実行することができる。

●Flex プレゼンテーションサーバー、 SSL 通信のクライアント機能(送り手)の設定

特に テスト用証明書を使って SSL 通信を行う場合、SSL のクライアントとして Flex プレゼンテーションサーバーが正しく通信できるよう、追加の設定を行う必要があります。

作業としては 認証局から発行された証明書(テスト用ルート証明書)を JVM が持つ cert store にインポートします。
テスト用ルート証明書は、テスト発行した証明書で警告メッセージが出ないようにするためにブラウザーに設定するものとして提供されるものです。 Flex アプリケーションが SSL 通信をするとき、Flex プレゼンテーションサーバーはSSL 通信のクライアントともなるため、 この証明書をサーバー側にインポートします。

  1. 認証局から入手した証明書(テスト用ルート証明書)を JVM の cert store の場所に保存します。これは通常
    <JAVA_HOME>\jre\lib\security
    の下になります。(必ず、Flex を起動する WebLogic サーバーが利用する JVM に対して作業します。)
  2. 「コマンドプロンプト」を開き、先ほど証明書を保存した場所に移動します。
  3. コマンドラインから Javaコマンドを実行できることを確認してください。もし実行できないようであれば、環境変数を設定し、実行できるようにします。
  4. Cert store のバックアップを取ります。
       例:
         copy cacerts cacerts.org
  5. 次のコマンドを実行し、証明書をインポートします。
    > keytool -import -trustcacerts -alias [ユニークな名前] -file [取得した証明書のファイル名]
    > -keystore cacerts
    例:
    keytool -import -trustcacerts -alias defaultwebservercert -file defaultwebserver.cer -keystore cacerts
  6. パスワードを聞いてきたら JVM cert store のデフォルトのパスワード changeit を入力します。
  7. サーバーを再起動します。

このほか、JVM のバージョンが古いと JVM に入っている証明書の期限が切れているため、SSL 通信ができないということがあります。この点については、次のドキュメントを参考にしてください。

http://www.macromedia.com/cfusion/knowledgebase/index.cfm?id=tn_19298

ちなみにわたしは IIS 5.0 + JRun 4.0 + Flex 1.5 という組み合わせで、HTTPService タグで SSL 通信が正しくできることを確認しました。