在现实应用中,如果使用未购买license的(或破解版的)FlexBuidler去编译flash文件,是要付法律责任的,特别是企业开发。所以,你必须利用Flex SDK自己手工编译。
Adobe提供了一个FlexTasks这个Ant扩展来辅助进行编译操作,在我的另一篇博客中简要介绍了如何通过其来build swc文件,详细见:http://blog.csdn.net/james999/archive/2009/01/05/3715018.aspx 。有关Adobe的FlexTasks这个扩展,可以参见:http://livedocs.adobe.com/flex/3/html/help.html?content=anttasks_3.html 。
另外,使用ant来build还有一个好处,是比FlexBuilder本身提供的Merged into code模式编译方式,编译的swf文件要小很多,基本上能够小35%左右,这可不是一个小数目哦。但Ant build没有提供RSL模式,这是也是一个弊端。如果你希望能够实现RSL方式,来缓解客户端的加载数据量,那估计最好是购买正版的Flex Builder。
如果你直接按照参考文档中的<mxmlc>命令来编译mxml应用,如果你的应用中需要引用很多assets,那么很不幸,你将会得到如下之类的异常:
main: [mxmlc] Loading configuration file D:/IDE/Adobe/Flex Builder 3/sdks/3.0.0/frameworks/flex-config .xml [mxmlc] D:/WorkDir/Flex Projects/Walle/primeton.bps.modeler.flow/flex_src/flowdesigner3_362209.c ache (The system cannot find the file specified) [mxmlc] D:/WorkDir/Flex Projects/Walle/primeton.bps.modeler.flow/flex_src/com/primeton/flow/diag ram/editor/figures/ActivityIconFactory.as(16): col: 10: Error: unable to resolve 'assets/images/manu al_activity.gif' for transcoding [mxmlc] [mxmlc] [Embed(source='assets/images/manual_activity.gif')] [mxmlc] ^
这是因为你的这些assets资源无法被编译器找到。
在Shreyas Purohit的一篇博客中,介绍根本原因,以及可以解决这个问题的一种方式,可参考:
http://sacrosanctblood.blogspot.com/2008/12/flex-solution-to-error-unable-to.html
下面的样例代码,就是根据我的本机的情况,做的修改。大家也可以参考一下。整个思路就是:动态把assets文件,编译成一个swc包,然后在编译flex application的时候动态引用进来。
首先,你需要引入ant-contrib这个ant扩展组件,在http://ant-contrib.sourceforge.net/ 上有介绍及下载。然后添加进你的build.xml中。
我的目录结构如下:
|- project
|--flex_src
|
|-- flowdesigner.mxml
|-- assets
| |-- icons
| |-- images
| |-- css
在build.properties中,声明你的flex文件地址,及src地址:
###### Flex Properties ############################## # change this path to your flex sdk directory # Use "/" in your directory path e.g. C:/FlexSDK/3.0.0 FLEX_HOME=D:/IDE/Adobe/Flex Builder 3/sdks/3.0.0 ###### Project Properties ########################### src-dir=${basedir}/flex_src
下面是build.xml
<project name="Ant build SWC sample" basedir="." default="main"> <property file="build.properties" /> <taskdef resource="flexTasks.tasks" classpath="${FLEX_HOME}/ant/lib/flexTasks.jar" /> <taskdef resource="net/sf/antcontrib/antlib.xml"> <classpath> <pathelement location="D:/ant171/lib/ant-contrib-version.jar"/> </classpath> </taskdef> <target name="buildAssertsSWC"> <fileset id="assets.flex" dir="${src-dir-assets}" includes="**/*.gif,**/*.jpg,**/*.png,**/*.css,**/*.swf,**/*.TTF,**/*.jpeg,**/*.xml" /> <pathconvert pathsep=" " property="assets.flex.output" refid="assets.flex" dirsep="/"> <map from="${src-dir-assets}/" to=""/> </pathconvert> <echo message="...Resources being considered..."/> <var name="filelist" value=""/> <var name="prefixfilelist" value="-include-file"/> <for list="${assets.flex.output}" delimiter=" " param="asset"> <sequential> <echo>Asset: @{asset}</echo> <var name="filelist_tmp" value="${filelist}"/> <var name="filelist" unset="true"/> <var name="filelist" value="${filelist_tmp} ${prefixfilelist} @{asset} '${src-dir-assets}/@{asset}'"/> </sequential> </for> <echo message="-output '${basedir}/flex_libs/assets.swc' ${filelist}"/> <exec executable="${FLEX_HOME}/bin/compc.exe" failonerror="true"> <arg line="-output '${basedir}/flex_libs/assets.swc' ${filelist}"/> </exec> </target> <target name="main" depends="buildAssertsSWC"> <path id="src.files"> <fileset dir="${src-dir}"> <include name="**/**"/> </fileset> </path> <mxmlc file="${APP_ROOT}/flowdesigner.mxml" output="build/flowdesigner.swf" actionscript-file-encoding="UTF-8" keep-generated-actionscript="true" incremental="true" > <load-config filename="${FLEX_HOME}/frameworks/flex-config.xml"/> <source-path path-element="${FLEX_HOME}/frameworks"/> <compiler.library-path dir="${FLEX_HOME}/frameworks" append="true"> <include name="libs" /> </compiler.library-path> <compiler.library-path dir="${basedir}" append="true"> <include name="flex_libs" /> </compiler.library-path> <compiler.source-path path-element="${src-dir}"/> </mxmlc> </target> </project>
然后运行ant命令,即可。