Ubuntu 22.04 安装 Apache Flex 指南

在 Ubuntu 22.04 上从零安装 Apache Flex SDK 4.16.1,覆盖 JDK 8 与 Ant 环境、官方 bin 包加 ant 安装器补齐 Adobe 依赖、playerglobal 手动直装备选方案、FLEX_HOME 与 JVM 参数配置、多版本管理与卸载,命令回显均实测通过。

Apache FlexApache Flex2026/10/15

Ubuntu 22.04 安装 Apache Flex 指南

目标:在 Ubuntu 22.04 上从零搭建 Apache Flex SDK 4.16.1 的命令行编译环境(JDK 8 + Ant 1.10.12 + playerglobal.swc),跑通 ant 安装器补齐 Adobe 依赖与手动直装两条落地路径,并完成第一个 MXML 应用的编译验证;本文全部命令与回显均已在 Ubuntu 22.04 实测通过。

Apache Flex 是构建 Flash 平台富互联网应用(RIA)的 SDK:编译器(mxmlc/compc)、UI 框架库(framework.swc、spark.swc、mx.swc)与工具链(asdoc、swfdump、fcsh 等)的集合,把 MXML 标记与 ActionScript 3 源码编译为可在 Flash Player 中运行的 SWF 文件。它是纯 Java 工具链,没有独立进程与常驻服务,安装的本质是「装好 JDK 与 Ant → 解压官方 bin 包 → 补齐 Adobe 许可的依赖组件(playerglobal.swc 等)→ 编译最小应用验证」。本文给出两条落地方式:官方 bin 包 + ant 安装器(推荐,自动下载 Adobe 组件),以及 playerglobal 手动直装(安装器失败时的备选)。

一、环境信息

本节先固定可复现的基线环境,后续所有命令均在此环境执行。

  • 操作系统:Ubuntu 22.04.5 LTS(x86_64)
  • JDK:OpenJDK 1.8.0_504(apt 包 openjdk-8-jdk)
  • 构建工具:Apache Ant 1.10.12
  • SDK:Apache Flex 4.16.1(build 20171115)
  • Adobe 组件:playerglobal 32.0(Flash Player 32 API 层,对应 SWF 版本 43)
  • 官方下载目录:https://downloads.apache.org/flex/
  • 安装目录:/opt/apache-flex-sdk-4.16.1-bin
  • 验证用工作目录:/root/hello

系统与基线确认(实时回显):

grep PRETTY_NAME /etc/os-release
uname -m
PRETTY_NAME="Ubuntu 22.04.5 LTS"
x86_64

💡 说明:Flex 编译链是「Java 进程」而非常驻服务,「安装完成」的判定标准是 mxmlc 能把一个 MXML 文件编译出 SWF 并通过 file/swfdump 验证产物,而不是某个端口处于监听状态。Flash Player 端已于 2020 年底停止维护,编译产物主要用于存量系统维护、离线播放器或归档场景。

二、前置条件

  1. 具有 root 或 sudo 权限的 Ubuntu 22.04 系统。
  2. 可访问 Ubuntu 官方软件源(apt update 能正常拉取索引)。
  3. 可访问 Apache 下载站 downloads.apache.org、Apache 官网 flex.apache.org 与 Adobe 组件下载域 fpdownload.macromedia.com。若国外源直连缓慢或失败,可配置 HTTP 代理(本文实测环境通过 http://192.168.1.62:7897 代理访问)。
  4. 至少 1 GB 可用磁盘空间(SDK bin 包约 66 MB,解压后约 450 MB,加 JDK 与 Ant 合计约 1 GB)。

网络连通性确认(实时回显):

curl -sI --max-time 20 https://downloads.apache.org/flex/ | head -2
HTTP/1.1 200 Connection established

curl -sI --max-time 20 https://fpdownload.macromedia.com/get/flashplayer/updaters/32/playerglobal32_0.swc | head -2
HTTP/1.1 200 Connection established

⚠️ 注意:实测环境经代理访问时第一行回显 HTTP/1.1 200 Connection established 是代理隧道建立提示,随后才是目标站点的真实响应;直连环境第一行应为 HTTP/2 200 或 HTTP/1.1 200 OK。若两者都没有,先解决网络再继续。

三、版本选型说明

Apache Flex 的官方版本发布目录为 https://downloads.apache.org/flex/,实测当前目录结构如下:

curl -s --max-time 30 https://downloads.apache.org/flex/ | grep -oE 'href="[0-9][^"/]*/|"BlazeDS/"|"falcon/"|"flexunit/"|"installer/"' | sort -u
"4.16.1/"
"BlazeDS/"
"falcon/"
"flexunit/"
"installer/"

主线 SDK 只有一个当前版本 4.16.1,其 binaries/ 子目录实测内容:

curl -s --max-time 30 https://downloads.apache.org/flex/4.16.1/binaries/ | grep -oE 'apache-flex-sdk-4.16.1[^"<]*' | sort -u
apache-flex-sdk-4.16.1-bin.tar.gz
apache-flex-sdk-4.16.1-bin.tar.gz.asc
apache-flex-sdk-4.16.1-bin.tar.gz.md5
apache-flex-sdk-4.16.1-bin.zip
apache-flex-sdk-4.16.1-bin.zip.asc
apache-flex-sdk-4.16.1-bin.zip.md5
版本线最新版状态适用场景
Apache Flex 4.x(主线)4.16.1官方当前版本,bin 包与源码包均可下载存量 Flex 工程维护与编译
Adobe Flex 4.6(前身)4.6Adobe 时代最终版,Apache Flex 4.16 与其代码基本兼容老项目对照
Apache Royale(后继)0.9.x 独立发布新项目,把 MXML/AS3 编译为 JS想延续 Flex 开发模式但目标换成浏览器 JS

版本事实核对:解压后的 flex-sdk-description.xml 记录了准确版本信息(实测):

grep -E 'version|build' /opt/apache-flex-sdk-4.16.1-bin/flex-sdk-description.xml
<version>4.16.1</version>
<build>20171115</build>

本文实际采用 4.16.1,理由是它为官方下载目录当前唯一的 SDK 主线版本,bin 包开箱即用,无需源码编译。

💡 技术拓展:RIA 技术时代的几条路线对比——

方案目标运行时语言现状
Apache FlexFlash Player / AIRMXML + ActionScript 3官方仍在发布,运行时已停更,适合存量维护
Microsoft Silverlight浏览器插件XAML + C#已终止支持
Haxe + OpenFL多端(含 HTML5)Haxe活跃,常用于从 Flash 技术栈迁移游戏
Apache Royale浏览器 JSMXML + ActionScript 3Apache Flex 的后继项目,编译为 JS

本文采用 Apache Flex 4.16.1,理由是任务目标是「Flash 存量 SWF 的可复现编译环境」,只有原版 Flex SDK 能保证字节码与框架库行为和当年一致;若做新项目,优先评估 Royale 或纯 HTML5 方案。

四、方案 A:官方 bin 包 + ant 安装器(推荐)

4.1 方案说明

Apache Flex 的 bin 包出于许可原因不内置 Adobe 组件,解压后是一个「半成品」:编译器与 Apache 框架库齐全,但缺少 Adobe 许可下的 playerglobal.swc(Flash Player API 定义)、osmf.swc(视频组件依赖)与 SWFObject(HTML 包装模板)。官方提供的补齐方式就是包内自带的 installer.xml:ant -f installer.xml 会在线拉取 flex.apache.org 的安装配置,按需下载上述 Adobe 组件并修正 frameworks/flex-config.xml。方案 A 的链路是:apt 装 JDK 8 与 Ant → 下载 bin 包并校验 md5 → 解压 → 运行 ant 安装器 → 验证。

4.2 安装 JDK 8 与 Ant

Flex 4.16.1 的命令行编译器对 JDK 版本宽容(实测 JDK 8/11/17 均能跑 mxmlc),但配套的 asdoc 文档工具在 JDK 9+ 上会因 -Xbootclasspath/p 选项被移除而无法启动(实测报错见 4.6 节),因此基线选择 JDK 8:

apt-get install -y openjdk-8-jdk ant file unzip tree
# 输出节选(实测,二次执行回显)
Building dependency tree...
Reading state information...
ant is already the newest version (1.10.12-1).
tree is already the newest version (2.0.2-1).
file is already the newest version (1:5.41-3ubuntu0.1).
unzip is already the newest version (6.0-26ubuntu3.2).
openjdk-8-jdk is already the newest version (8u504-ga-1ubuntu1~22.04.3).
0 upgraded, 0 newly installed, 0 to remove and 2 not upgraded.

说明:首次执行同一命令时,回显会包含各包的安装过程行(实测首装时出现 Setting up unzip (6.0-26ubuntu3.2)、Setting up tree (2.0.2-1) 等行,本文回显取自复检用的二次执行);file、unzip、tree 是产物验证与 SWC 包结构检查的辅助工具,与 JDK、Ant 一并装齐。

Ubuntu 22.04 可能同时装有多个 JDK,把系统默认 java 固定到 8(实测本机装有 11 与 8 两个):

update-alternatives --set java /usr/lib/jvm/java-8-openjdk-amd64/jre/bin/java
update-alternatives: using /usr/lib/jvm/java-8-openjdk-amd64/jre/bin/java to provide /usr/bin/java (java) in manual mode

确认版本(实时回显):

java -version 2>&1
ant -version
openjdk version "1.8.0_504"
OpenJDK Runtime Environment (build 1.8.0_504-8u504-ga-1ubuntu1~22.04.3-b01)
OpenJDK 64-Bit Server VM (build 25.504-b01, mixed mode)
Apache Ant(TM) version 1.10.12 compiled on January 17 1970

验证点:java -version 显示 1.8.0 系列(本文实测 1.8.0_504)且 ant -version 能输出 1.10.x 即就绪。

4.3 下载 SDK 并校验 md5

cd /opt && curl -sO --max-time 300 https://downloads.apache.org/flex/4.16.1/binaries/apache-flex-sdk-4.16.1-bin.tar.gz
curl -sO --max-time 30 https://downloads.apache.org/flex/4.16.1/binaries/apache-flex-sdk-4.16.1-bin.tar.gz.md5
ls -l apache-flex-sdk-4.16.1-bin.tar.gz
-rw-r--r-- 1 root root 66183615 Oct 15 15:47 apache-flex-sdk-4.16.1-bin.tar.gz

校验 md5(期望值与实测值必须逐字一致):

echo "期望: $(cat apache-flex-sdk-4.16.1-bin.tar.gz.md5)"
echo "实测: $(md5sum apache-flex-sdk-4.16.1-bin.tar.gz | awk '{print $1}')"
期望: 0fba6c912c3919ae1b978ca2d053fe07
实测: 0fba6c912c3919ae1b978ca2d053fe07

⚠️ 注意:官方包仅提供 md5 与 asc 两种校验文件。生产服务器建议再 gpg --import 官方 KEYS 后验证 asc 签名;md5 一致至少能排除传输损坏。

4.4 解压与目录结构

tar xzf apache-flex-sdk-4.16.1-bin.tar.gz && ls apache-flex-sdk-4.16.1-bin/
ant
apache-flex-sdk-installer-config.xml
asdoc
bin
build.properties
build.xml
CONTRIBUTING
CONTRIBUTORS
env-template.properties
flex-sdk-description.xml
frameworks
ide
installer.properties
lib
LICENSE
licenseParts
NOTICE
README
RELEASE_NOTES
samples
templates

关键目录:bin/ 是全部命令行工具,frameworks/ 是框架库与编译配置,ant/lib/flexTasks.jar 是 Ant 集成任务,templates/swfobject/ 是 HTML 包装模板。此时 frameworks/libs/player/ 下没有任何 playerglobal 子目录,直接编译会失败,这正是 4.5 节要补齐的组件。

4.5 运行 ant 安装器补齐 Adobe 依赖

installer.xml 会请求 Adobe 组件的下载许可并下载。三个实用参数:-Dflash.sdk.version=32.0 指定 playerglobal 目标版本(官方配置的默认值也是 32.0);-Dair.donot.ask=true 跳过 Adobe AIR SDK(Linux 上 AIR 支持是实验性的,本文场景只编译浏览器 SWF,不需要);-Dfontswf.donot.ask=true 跳过 Adobe 字体引擎 jar(源文件托管在 SourceForge 的 Adobe 老仓库,现时常下载失败)。许可确认通过标准输入回答 y:

export JAVA_HOME=/usr/lib/jvm/java-8-openjdk-amd64
export ANT_OPTS="-Dhttp.proxyHost=192.168.1.62 -Dhttp.proxyPort=7897 -Dhttps.proxyHost=192.168.1.62 -Dhttps.proxyPort=7897"
cd /opt/apache-flex-sdk-4.16.1-bin
printf 'y\n' | ant -f installer.xml -Dflash.sdk.version=32.0 -Dair.donot.ask=true -Dfontswf.donot.ask=true
# 输出节选(实测首尾)
      [get] Getting: http://flex.apache.org/installer/properties/sdk/en_US.properties
      [get] To: /opt/apache-flex-sdk-4.16.1-bin/en_US.properties
      [get] http://flex.apache.org/installer/properties/sdk/en_US.properties permanently moved to https://flex.apache.org/installer/properties/sdk/en_US.properties

install:
   [delete] Deleting directory /opt/apache-flex-sdk-4.16.1-bin/in
     [echo] /opt/apache-flex-sdk-4.16.1-bin is now an IDE compatible folder

BUILD SUCCESSFUL
Total time: 51 seconds

逐项说明:

  • printf 'y\n' |:给 <input> 许可提问喂一个 y;不接管道时 ant 会交互式提问,回答 y 同样有效。
  • ANT_OPTS:ant 下载任务使用 JVM 网络参数。直连可达的服务器无需设置;走代理时必须配置,否则 ant 拉取 flex.apache.org 配置会失败。
  • permanently moved to https://:flex.apache.org 现在把 http 请求 301 重定向到 https,实测 Ant 1.10.12 能自动跟随重定向,安装不受影响;老版本 Ant 若卡在重定向,升级 Ant 即可。

4.6 验证安装

Adobe 组件落位与完整性(实时回显):

ls -l /opt/apache-flex-sdk-4.16.1-bin/frameworks/libs/player/32.0/playerglobal.swc
md5sum /opt/apache-flex-sdk-4.16.1-bin/frameworks/libs/player/32.0/playerglobal.swc
ls -l /opt/apache-flex-sdk-4.16.1-bin/frameworks/libs/osmf.swc
ls /opt/apache-flex-sdk-4.16.1-bin/frameworks/rsls/ | head -4
-rw-r--r-- 1 root root 472260 Oct 15 07:54 /opt/apache-flex-sdk-4.16.1-bin/frameworks/libs/player/32.0/playerglobal.swc
513a4f254444e43b94bb0758398ea23c  /opt/apache-flex-sdk-4.16.1-bin/frameworks/libs/player/32.0/playerglobal.swc
-rw-r--r-- 1 root root 266698 Oct 15 07:55 /opt/apache-flex-sdk-4.16.1-bin/frameworks/libs/osmf.swc
advancedgrids_4.16.1.20171115.swf
apache_4.16.1.20171115.swf
charts_4.16.1.20171115.swf
experimental_4.16.1.20171115.swf

playerglobal.swc 的 md5 与官方安装配置(flex.apache.org/installer/sdk-installer-config-4.0.xml 中 32.0 版本条目)完全一致。ant 安装器还改写了编译配置,实测核对:

grep -n 'target-player' /opt/apache-flex-sdk-4.16.1-bin/frameworks/flex-config.xml | head -1
grep -n 'swf-version' /opt/apache-flex-sdk-4.16.1-bin/frameworks/flex-config.xml | head -1
25:   <target-player>32.0</target-player>
28:   <swf-version>43</swf-version>

最终验证:编译一个真实 MXML 应用(文件 /root/hello/HelloWorld.mxml,内容见第五章 5.4 节,或从本文快速入门篇复制)。先给出最小复现命令与回显:

export FLEX_HOME=/opt/apache-flex-sdk-4.16.1-bin
export PATH=$JAVA_HOME/bin:$PATH
cd /root/hello && time $FLEX_HOME/bin/mxmlc HelloWorld.mxml 2>&1 | tail -2
file HelloWorld.swf
/root/hello/HelloWorld.swf (511462 bytes)

real    0m2.942s
user    0m9.919s
sys     0m0.588s
HelloWorld.swf: Macromedia Flash data (compressed), version 43

结果解读:编译器加载了 frameworks/flex-config.xml 后产出 511462 字节的 SWF,file 识别为「Flash 数据(压缩),版本 43」,与配置的 <target-player>32.0 对应的 SWF 版本 43 一致——安装闭环完成。swfdump 的深入验证见本专栏编译器详解篇。

五、方案 B:playerglobal 手动直装(安装器失败时的备选)

5.1 方案说明

当服务器无法访问 flex.apache.org 在线配置、或 ant 安装器被内网策略阻断时,可绕过 installer.xml:直接从 Adobe 域名下载 playerglobal.swc 放入约定目录,再手工修正 flex-config.xml 中的三个占位值。代价是拿不到 osmf.swc 与 SWFObject 模板(不用视频组件与自动 HTML 包装则无影响)。本方案已在实测环境完整走通并编译成功。

5.2 下载 playerglobal.swc

官方安装配置中 32.0 版本的 Adobe 直链为 https://fpdownload.macromedia.com/get/flashplayer/updaters/32/playerglobal32_0.swc(md5 513a4f254444e43b94bb0758398ea23c):

cd /opt/apache-flex-sdk-4.16.1-bin
mkdir -p frameworks/libs/player/32.0
export http_proxy=http://192.168.1.62:7897 https_proxy=http://192.168.1.62:7897
curl -sO --max-time 120 https://fpdownload.macromedia.com/get/flashplayer/updaters/32/playerglobal32_0.swc
mv playerglobal32_0.swc frameworks/libs/player/32.0/playerglobal.swc
md5sum frameworks/libs/player/32.0/playerglobal.swc
513a4f254444e43b94bb0758398ea23c  frameworks/libs/player/32.0/playerglobal.swc

校验点:md5 必须等于 513a4f254444e43b94bb0758398ea23c,它是编译器运行时 library-path 的唯一数据来源。

5.3 修正 flex-config.xml

未跑安装器的原始 flex-config.xml 带有三个出厂占位值:{playerglobalHome}(library-path 前缀,第 84 行附近)、<target-player>27.0</target-player>(第 25 行)与 <swf-version>38</swf-version>(第 28 行)。用 sed 修正为 32.0/43 并实测验证:

sed -i -e 's|{playerglobalHome}|libs/player|g' -e 's|<target-player>27.0</target-player>|<target-player>32.0</target-player>|' frameworks/flex-config.xml
sed -i 's|<swf-version>38</swf-version>|<swf-version>43</swf-version>|' frameworks/flex-config.xml
grep -n 'target-player' frameworks/flex-config.xml | head -1
grep -n 'swf-version' frameworks/flex-config.xml | head -1
25:   <target-player>32.0</target-player>
28:   <swf-version>43</swf-version>

5.4 编译验证

在同一目录结构下直接编译(与方案 A 相同的 HelloWorld.mxml):

cd /root/hello && /opt/apache-flex-sdk-4.16.1-bin/bin/mxmlc HelloWorld.mxml 2>&1 | tail -1
file HelloWorld.swf
/root/hello/HelloWorld.swf (511459 bytes)
HelloWorld.swf: Macromedia Flash data (compressed), version 43

验证点:产物字节数与方案 A 同一量级(约 511 KB,差异来自编译时间戳与编译器运行环境),file 同样识别为 version 43,说明手动直装路径与安装器路径等价。

六、方案对比与选择建议

维度方案 A:ant 安装器方案 B:playerglobal 手动直装
联网要求需访问 flex.apache.org 与 Adobe 域仅需访问 Adobe 一个直链
组件完整性playerglobal、osmf、SWFObject、RSL 全齐仅 playerglobal
flex-config.xml自动改写为 32.0/43手工 sed 三处
许可确认交互确认 Adobe 许可下载即视为接受 Adobe 许可条款
适用场景常规首次安装内网受限、离线分发、CI 只需编译器

选型建议:常规环境一律方案 A,组件全且配置免手工;仅当安装器被网络策略卡住、且明确不需要视频组件与 HTML 模板时用方案 B。两者产出同一份可编译的 SDK,后续章节的配置对两者通用。

七、基础配置

Flex SDK 没有服务端配置文件,核心「配置」是三个环境变量与编译器 JVM 参数。

FLEX_HOME:bin/mxmlc 等脚本在未设置时会按脚本自身位置自动推导 SDK 根目录(实测不设置也能工作):

env -u FLEX_HOME /opt/apache-flex-sdk-4.16.1-bin/bin/mxmlc -version
Version 4.16.1 build 20171115

显式导出可让脚本在任意工作目录下稳定指向指定 SDK,写入 /etc/profile.d/flex.sh 即可全局生效(逐条命令,按需执行):

echo 'export FLEX_HOME=/opt/apache-flex-sdk-4.16.1-bin' > /etc/profile.d/flex.sh
echo 'export PATH=$FLEX_HOME/bin:$PATH' >> /etc/profile.d/flex.sh
chmod +x /etc/profile.d/flex.sh && source /etc/profile.d/flex.sh
mxmlc -version
Version 4.16.1 build 20171115

逐项说明:

  • FLEX_HOME:SDK 根目录。bin/ 下的启动脚本按 脚本位置上一级 自动推导,标准目录布局下可不设置;多版本共存或软链场景必须显式设置。
  • PATH:加入 $FLEX_HOME/bin 后可直接敲 mxmlc/compc,免写全路径。
  • PLAYERGLOBAL_HOME:可选。默认布局把 playerglobal 放在 $FLEX_HOME/frameworks/libs/player/<版本>/(本文实测即此布局,报错回显 unable to open 'libs/player/11.1/playerglobal.swc' 也印证了默认查找路径);把多个版本的 playerglobal 集中放在别处时才需要设置该变量。
  • JVM 堆参数位置:编译器启动脚本 bin/mxmlc 内写死了一行 VMARGS="-Xmx384m -Dsun.io.useCanonCaches=false -Djava.util.Arrays.useLegacyMergeSort=true ";在不改脚本的前提下,可通过环境变量 SETUP_SH_VMARGS 追加 JVM 参数(脚本会把它们排在 VMARGS 之后,重复的 -Xmx 以最后一次为准)。实测把堆改为 256–512 MB 并用 -XX:+PrintFlagsFinal 验证生效:
SETUP_SH_VMARGS="-Xms256m -Xmx512m -XX:+PrintFlagsFinal" $FLEX_HOME/bin/mxmlc HelloWorld.mxml 2>&1 | grep -E 'InitialHeapSize|MaxHeapSize'
    uintx InitialHeapSize                          := 268435456                           {product}
    uintx MaxHeapSize                              := 536870912                           {product}

268435456 = 256 MB,536870912 = 512 MB,参数确实生效。工程化构建建议统一在构建脚本里固定 SETUP_SH_VMARGS="-Xms256m -Xmx512m",避免依赖手工改 bin/mxmlc。

八、多版本与多 playerglobal 管理

SDK 多版本靠「并列目录 + 显式 FLEX_HOME」实现。安装另一版本时逐条执行(以未来出现的新版本号替代下载路径中的版本段,命令模式与 4.3、4.4 节完全一致):

mkdir -p /opt/flex-sdks && mv /opt/apache-flex-sdk-4.16.1-bin /opt/flex-sdks/apache-flex-sdk-4.16.1-bin
export FLEX_HOME=/opt/flex-sdks/apache-flex-sdk-4.16.1-bin
mxmlc -version
Version 4.16.1 build 20171115

要点:切换版本就是切换 FLEX_HOME 指向;mxmlc -version 回显的 build 号即当前生效版本。

同一 SDK 内多 playerglobal 共存是更常见的需求:在 frameworks/libs/player/ 下并列放置多个版本目录,编译时用 -target-player 切换。实测目录里只有 32.0 时,指到不存在的 11.1 会得到明确报错(这一回显同时验证了目录布局约定):

cd /root/hello && $FLEX_HOME/bin/mxmlc -target-player=11.1 HelloWorld.mxml 2>&1 | grep Error
/opt/apache-flex-sdk-4.16.1-bin/frameworks/flex-config.xml(65): Error: unable to open 'libs/player/11.1/playerglobal.swc'

如需 11.1,把 playerglobal11_1.swc 下载后放入 frameworks/libs/player/11.1/playerglobal.swc 即可,与 5.2 节同一方法。

九、常见问题(FAQ)

Q1:ant 安装器报下载失败或卡在获取配置? installer.xml 启动时要从 http://flex.apache.org/installer/sdk-installer-config-4.0.xml 拉取版本与 URL 配置。实测该地址现在 301 跳转到 https,Ant 1.10.12 自动跟随;老版本 Ant 或未配置代理(ANT_OPTS 未设)时会直接失败。修复:升级 Ant 到 1.10.x 并按 4.5 节设置 ANT_OPTS;彻底不通网时改走方案 B。

Q2:ant 提示输入许可后直接 BUILD FAILED? ask-air/ask-flash 是许可确认提问,回答 n 会被安装器判定为拒绝 Adobe 许可而终止构建。只想装 playerglobal 不想装 AIR 时,不要在提问处回答 n,而是像 4.5 节那样传 -Dair.donot.ask=true 跳过提问环节。

Q3:编译报 Error: unable to open '{playerglobalHome}/32.0'? 说明用了没有跑过安装器的原始 flex-config.xml(该报错在实测的 JDK 17 环境同样出现,根因是配置未修正,与 JDK 版本无关)。安装器会把 {playerglobalHome} 替换为 libs/player;跳过安装器时按 5.3 节手工 sed。判断方法:grep -n playerglobalHome $FLEX_HOME/frameworks/flex-config.xml,有输出即未修正。

Q4:-target-player=11.1 报 unable to open 'libs/player/11.1/playerglobal.swc'? 目标 player 版本必须有对应的 frameworks/libs/player/<版本>/playerglobal.swc。要么改回已安装的 32.0(不传 -target-player 时用配置文件第 25 行的默认值),要么按 5.2 节补装对应版本的 playerglobal。

Q5:asdoc 报 Could not create the Java Virtual Machine? 实测在 JDK 17 上 bin/asdoc 报 -Xbootclasspath/p is no longer a supported option.,原因是 asdoc 启动脚本把 -Xbootclasspath/p:$FLEX_HOME/lib/xalan.jar 传给了 JVM,而 JDK 9+ 已移除该选项(mxmlc/compc 不受影响,实测 JDK 8/11/17 都能正常编译)。需要生成 API 文档时切回 JDK 8(update-alternatives --set java 指向 8,或给 asdoc 脚本单独指定 JAVA_HOME)。

Q6:mxmlc 编译时 MXML 里的中文标签显示成问号? 编译器输出与源码解析受终端 locale 影响:POSIX/C locale 下错误提示里的中文会变成问号(实测 <mx:Button label="推送 66.6"> 在报错回显中显示为问号),但字符串会按 UTF-8 正确编译进 SWF。把会话 locale 设为 C.UTF-8(export LANG=C.UTF-8)即可让日志正常显示。

Q7:下载的 playerglobal md5 与官方配置对不上? 确认下载的是 32.0 对应的 playerglobal32_0.swc(注意文件名中的下划线);版本号与文件名的对应关系见 flex.apache.org/installer/sdk-installer-config-4.0.xml 的 flash.sdk.file.<版本> 条目。也不要把 swc 重命名后再校验——校验的是文件内容,改名不影响 md5,但放错目录(不在 libs/player/32.0/ 下)会让编译器找不到。

十、卸载与清理

Flex SDK 是纯目录式安装,卸载即删除目录与环境变量。清理演示工程与安装包(实测回显):

rm -rf /root/hello /opt/apache-flex-sdk-4.16.1-bin.tar.gz
ls /root/hello 2>&1
ls: cannot access '/root/hello': No such file or directory

删除 SDK 本体(在确认不再编译 Flex 工程后执行):

rm -rf /opt/apache-flex-sdk-4.16.1-bin
ls /opt/apache-flex-sdk-4.16.1-bin 2>&1
ls: cannot access '/opt/apache-flex-sdk-4.16.1-bin': No such file or directory

移除全局环境变量文件:

rm -f /etc/profile.d/flex.sh

卸载 Ant 与 JDK(先 -s 预演确认将删除的包,无误后去掉 -s 真正执行):

apt-get -s purge -y ant
# 输出节选(实测)
The following packages will be REMOVED:
Purg ant-optional [1.10.12-1]
Purg ant [1.10.12-1]
apt-get purge -y ant openjdk-8-jdk && apt-get autoremove -y

十一、参考链接

  1. Apache Flex 官方主页:https://flex.apache.org/
  2. 官方发布下载目录:https://downloads.apache.org/flex/
  3. 4.16.1 发行说明(RELEASE_NOTES):https://downloads.apache.org/flex/4.16.1/RELEASE_NOTES
  4. ant 安装器在线版本配置(playerglobal 各版本 URL 与 md5):https://flex.apache.org/installer/sdk-installer-config-4.0.xml
  5. Apache Flex 安装帮助(Ant 安装方式官方说明):https://cwiki.apache.org/confluence/display/FLEX/Installation+help
  6. playerglobal 32.0 直链:https://fpdownload.macromedia.com/get/flashplayer/updaters/32/playerglobal32_0.swc