CentOS 8 安装 Apache Flex 指南

在 CentOS 8 上从零安装 Apache Flex SDK 4.16.1,覆盖 EOL 后阿里云 vault 换源、JDK 8 与 Ant 环境、ant 安装器补齐 Adobe 依赖、playerglobal 手动直装备选方案、FLEX_HOME 配置与卸载清理,命令回显均实测通过。

Apache FlexApache Flex2026/10/15

CentOS 8 安装 Apache Flex 指南

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

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 许可的依赖组件 → 编译最小应用验证」。CentOS 8 已于 2021-12-31 停止维护,官方 mirrorlist 不再提供服务,本文用一节专门处理换源,这也是本篇与常规安装文档最大的差异点。

一、环境信息

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

  • 操作系统:CentOS Linux release 8.4.2105(x86_64)
  • JDK:OpenJDK 1.8.0_312(yum 包 java-1.8.0-openjdk-devel,来自 vault 8.5.2111)
  • 构建工具:Apache Ant 1.10.5
  • 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

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

cat /etc/centos-release
uname -m
CentOS Linux release 8.4.2105
x86_64

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

二、前置条件

  1. 具有 root 或 sudo 权限的 CentOS 8 系统。
  2. 可访问软件归档站 mirrors.aliyun.com(CentOS 8 EOL 后的包来源)、Apache 下载站 downloads.apache.org 与 Adobe 组件下载域 fpdownload.macromedia.com。国外源直连缓慢或失败时,可配置 HTTP 代理(本文实测环境通过 http://192.168.1.62:7897 代理访问)。
  3. 至少 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://mirrors.aliyun.com/centos-vault/8.5.2111/BaseOS/x86_64/os/repodata/ | 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/,主线 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

版本事实核对:解压后的 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>
版本线最新版状态适用场景
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

本文实际采用 4.16.1,理由是它为官方下载目录当前唯一的 SDK 主线版本,bin 包开箱即用;JDK 基线选 1.8,因为配套的 asdoc 工具在 JDK 9+ 上无法启动(实测报错见第九章 FAQ Q4),且 el8 的 vault 仓库中 java-1.8.0-openjdk-devel 齐备。

💡 技术拓展: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 的链路是:修好 yum 源 → 装 JDK 8 与 Ant → 下载 bin 包并校验 md5 → 解压 → 运行 ant 安装器 → 验证。

4.2 CentOS 8 EOL 换源(必做)

CentOS 8 EOL 后,系统默认的 mirrorlist.centos.org 不再为 8.x 提供仓库列表,直接 yum 会失败。先复现实测的故障现场:

yum install -y file 2>&1 | tail -4
Errors during downloading metadata for repository 'baseos':
  - Status code: 502 for http://mirrorlist.centos.org/?release=8&arch=x86_64&repo=BaseOS&infra=container (IP: 192.168.1.62)
Error: Failed to download metadata for repo 'baseos': Cannot prepare internal mirrorlist: Status code: 502 for http://mirrorlist.centos.org/?release=8&arch=x86_64&repo=BaseOS&infra=container (IP: 192.168.1.62)

修复方式是把 BaseOS、AppStream、Extras 三个主仓库整体重写到阿里云 CentOS 归档(vault)。实测选择 8.5.2111 快照(el8 仓库里 JDK 8 与 Ant 都齐备,AppStream 的 8.5.2111 快照也包含 java-17 包备用)。三个文件逐个重写:

cat > /etc/yum.repos.d/CentOS-Linux-BaseOS.repo <<'EOF'
[baseos]
name=CentOS Linux 8.5.2111 - BaseOS
baseurl=https://mirrors.aliyun.com/centos-vault/8.5.2111/BaseOS/$basearch/os/
gpgcheck=1
enabled=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-centosofficial
EOF
cat > /etc/yum.repos.d/CentOS-Linux-AppStream.repo <<'EOF'
[appstream]
name=CentOS Linux 8.5.2111 - AppStream
baseurl=https://mirrors.aliyun.com/centos-vault/8.5.2111/AppStream/$basearch/os/
gpgcheck=1
enabled=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-centosofficial
EOF
cat > /etc/yum.repos.d/CentOS-Linux-Extras.repo <<'EOF'
[extras]
name=CentOS Linux 8.5.2111 - Extras
baseurl=https://mirrors.aliyun.com/centos-vault/8.5.2111/extras/$basearch/os/
gpgcheck=1
enabled=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-centosofficial
EOF

刷新缓存并验证恢复(实时回显):

yum clean all -q && yum makecache 2>&1 | tail -4
CentOS Linux 8.5.2111 - AppStream               421 kB/s | 8.4 MB     00:20
CentOS Linux 8.5.2111 - BaseOS                  716 kB/s | 4.6 MB     00:06
CentOS Linux 8.5.2111 - Extras                   14 kB/s |  10 kB     00:00
Metadata cache created.

验证点:yum makecache 三行仓库都出现且 Metadata cache created.,yum 即恢复可用。

⚠️ 注意:不要用「sed 只改 baseurl 前缀」的方式换源——原 repo 文件里的 URL 段含有 $contentdir/$releasever 变量,vault 里不存在 centos-vault/8.5.2111/centos/8/ 这样的路径,实测会得到 Status code: 404(请求地址形如 centos-vault/8.5.2111/centos/8/BaseOS/x86_64/os/repodata/repomd.xml)。整文件重写、显式给出完整路径才是稳妥做法。

4.3 安装 JDK 8 与 Ant

yum install -y java-1.8.0-openjdk-devel ant file
# 输出节选(实测)
Package ant-1.10.5-1.module_el8.0.0+47+197dca37.noarch is already installed.
Dependencies resolved.
Nothing to do.
Complete!

确认版本(实时回显):

java -version 2>&1
ant -version
openjdk version "1.8.0_312"
OpenJDK Runtime Environment (build 1.8.0_312-b07)
OpenJDK 64-Bit Server VM (build 25.312-b07, mixed mode)
Apache Ant(TM) version 1.10.5 compiled on June 24 2019

el8 的工具链不读取 alternatives 的系统默认 java 设置,运行 ant 安装器前显式声明 JAVA_HOME(4.5 节命令已包含):

export JAVA_HOME=/usr/lib/jvm/java-1.8.0-openjdk
echo "JAVA_HOME=$JAVA_HOME"
JAVA_HOME=/usr/lib/jvm/java-1.8.0-openjdk

验证点:java -version 显示 1.8.0_312、ant -version 输出 1.10.5、javac -version 可用即就绪。

4.4 下载 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

4.5 解压与运行 ant 安装器

tar xzf apache-flex-sdk-4.16.1-bin.tar.gz && ls apache-flex-sdk-4.16.1-bin/ | head -8
ant
apache-flex-sdk-installer-config.xml
asdoc
bin
build.properties
build.xml
CONTRIBUTING
CONTRIBUTORS

此时 frameworks/libs/player/ 下没有任何 playerglobal 子目录,直接编译会失败。ant 安装器的三个实用参数:-Dflash.sdk.version=32.0 指定 playerglobal 目标版本(官方配置默认值也是 32.0);-Dair.donot.ask=true 跳过 Adobe AIR SDK(Linux 上 AIR 支持是实验性的);-Dfontswf.donot.ask=true 跳过 Adobe 字体引擎 jar(源文件托管在 SourceForge 的 Adobe 老仓库,现时常下载失败)。许可确认通过标准输入回答 y:

export JAVA_HOME=/usr/lib/jvm/java-1.8.0-openjdk
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: 54 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.5 能自动跟随重定向,安装不受影响。

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
-rw-r--r-- 1 root root 472260 Oct 15 08:02 /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 08:03 /opt/apache-flex-sdk-4.16.1-bin/frameworks/libs/osmf.swc

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(内容与 Ubuntu 篇相同的最小 Spark 应用:一个 Label、一个 TextInput 与一个计算平方的 Button)后执行:

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

结果解读:编译器加载 frameworks/flex-config.xml 后产出约 511 KB 的 SWF,file 识别为「Flash 数据(压缩),版本 43」,与配置的 <target-player>32.0 对应的 SWF 版本 43 一致——安装闭环完成。

五、方案 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

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 编译验证

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 与 PATH:bin/mxmlc 等脚本在未设置时会按脚本自身位置自动推导 SDK 根目录,但 el8 下更建议显式固化(多版本共存与构建脚本都依赖它)。写入 /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 以最后一次为准)。工程化构建建议统一在构建脚本里固定 SETUP_SH_VMARGS="-Xms256m -Xmx512m",并通过 -XX:+PrintFlagsFinal 验证生效(实测在 Ubuntu 环境验证过该机制,InitialHeapSize := 268435456、MaxHeapSize := 536870912,即 256–512 MB)。

八、多版本与多 playerglobal 管理

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

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:yum 报 Cannot prepare internal mirrorlist 或 502/403? CentOS 8 EOL 后 mirrorlist.centos.org 不再为 8.x 提供仓库列表,属于预期故障。按 4.2 节把 BaseOS、AppStream、Extras 三个 repo 文件整文件重写到 mirrors.aliyun.com/centos-vault/8.5.2111/,yum makecache 出现 Metadata cache created. 即恢复。

Q2:换源后报 Cannot download repodata/repomd.xml 且 URL 里出现 centos/8? 用了「sed 只替换域名前缀」的换源方式,原 repo 文件 URL 段的 $contentdir/$releasever 变量被保留,拼出了 vault 不存在的路径 centos-vault/8.5.2111/centos/8/BaseOS/(实测得到 Status code: 404,指向 repomd.xml 元数据下载失败)。改为 4.2 节的整文件重写,显式给出 BaseOS/$basearch/os/ 级别的完整路径。

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

Q4:asdoc 报 Could not create the Java Virtual Machine? 实测在 JDK 9+ 上 bin/asdoc 报 -Xbootclasspath/p is no longer a supported option.,原因是 asdoc 启动脚本把 -Xbootclasspath/p:$FLEX_HOME/lib/xalan.jar 传给了 JVM,而 JDK 9+ 已移除该选项(mxmlc/compc 不受影响)。需要生成 API 文档时把 JAVA_HOME 指回 java-1.8.0-openjdk 再执行 asdoc。

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

Q6:-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。

Q7:要不要用 JDK 17 跑 Flex 编译? 可以但不必要。实测 mxmlc/compc 在 JDK 8/11/17 上都能正常编译 SWF,但 asdoc 在 JDK 9+ 不可用;el8 的 AppStream 8.5.2111 快照里有 java-17-openjdk 可装,若无特殊需求,统一起见 Flex 工具链基线固定在 java-1.8.0-openjdk-devel,少一个变量。

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

十、卸载与清理

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(先 --test 预演确认包名与依赖,无误后去掉 --test 真正执行):

rpm -e --test ant-1.10.5-1.module_el8.0.0+47+197dca37.noarch
# 无输出且退出码为 0,表示可安全卸载(实测)
yum remove -y ant java-1.8.0-openjdk-devel && yum 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. CentOS Vault 归档(阿里云下载站):https://mirrors.aliyun.com/centos-vault/
  6. playerglobal 32.0 直链:https://fpdownload.macromedia.com/get/flashplayer/updaters/32/playerglobal32_0.swc