Ubuntu 22.04 安装 Apache Anakia 指南

在 Ubuntu 22.04 从零安装 Apache Anakia:apt 与官方 tar.gz 双方案装 Ant,部署 Velocity 1.7 发行包并校验,跑通 XML 转 HTML 首次转换验证。

Apache AnakiaAnakia2026/10/13

Ubuntu 22.04 安装 Apache Anakia 指南

目标:在 Ubuntu 22.04 服务器上从零搭建 Apache Anakia 文档转换环境——Anakia 以 Ant task 形态随 Apache Velocity 1.7 发行包分发(无独立安装包),因此完整路径是「安装 JDK + Ant → 部署 Velocity 1.7 发行包 → 验证 Anakia task 可用」,本文给出 apt 在线与官方 tar.gz 两套 Ant 安装方案并全部实测,已在 Ubuntu 22.04.5 LTS(OpenJDK 1.8.0_504、Ant 1.10.12 / 1.10.18、Velocity 1.7)实测通过。

一、环境信息

本篇所有命令与回显均在以下环境中实测采集,复现时请保持相近版本:

  • 操作系统:Ubuntu 22.04.5 LTS,x86_64
  • JDK:OpenJDK 1.8.0_504(openjdk-8-jdk-headless,apt 官方仓库)
  • 构建工具:Apache Ant 1.10.12(apt 仓库)、Apache Ant 1.10.18(官方 tar.gz,方案 B)
  • 组件版本:Apache Velocity 1.7(含 Anakia 的最后一条 1.x 线)
  • 下载源:https://archive.apache.org/dist/velocity/engine/1.7/
  • 安装目录:/opt/velocity-1.7(发行包)、/opt/apache-ant-1.10.18(方案 B)、/opt/anakia-demo(验证示例)
  • 执行用户:root

💡 技术拓展:把 XML 文档转成 HTML 的方案不止 Anakia 一种。常见方案对比——

方案原理特点与适用场景
AnakiaVelocity 模板 + JDOM 解析,跑在 Ant 里模板就是熟悉的 Velocity 语法,适合已有 Velocity 团队维护文档站
XSLTW3C 标准的 XML 样式表语言标准化最强,但语法晦涩、调试困难
AsciiDoctorAsciiDoc 文本 → HTML/PDF写作体验好,但需改用 AsciiDoc 源格式
Pandoc万能格式转换器一次性转换方便,不适合工程化流水线定制
静态站点生成器(Hugo/Jekyll 等)Markdown → 站点面向博客型站点,XML 源场景适配弱

本文因目标源是项目 xdocs 目录下的 XML 文件(Apache 项目传统文档格式),且 Anakia 与 Ant 构建天然集成,采用 Anakia 方案。

二、前置条件

本节完成软件源刷新、基础工具准备。Ubuntu 22.04 的 apt 官方仓库自带 OpenJDK 8 与 Ant,无需第三方源。

apt-get update -qq
DEBIAN_FRONTEND=noninteractive apt-get install -y openjdk-8-jdk-headless ant wget curl unzip

回显(实测,节选):

Setting up openjdk-8-jdk-headless:amd64 (8u504-ga-1ubuntu1~22.04.3) ...
Setting up ant (1.10.12-1) ...
Setting up ant-optional (1.10.12-1) ...
Processing triggers for man-db (2.10.2-1) ...

安装收尾无报错即成功。验证版本:

java -version 2>&1 | head -1
ant -version
wget --version | head -1

回显(实测):

openjdk version "1.8.0_504"
Apache Ant(TM) version 1.10.12 compiled on January 17 1970
GNU Wget 1.21.2 built on linux-gnu.

三个版本号都正确输出,前置完成。

⚠️ 注意:在极少数裁剪过的系统上安装 OpenJDK 时,dpkg 后置脚本可能报 update-alternatives: error: error creating symbolic link '/usr/share/binfmts/jar.dpkg-tmp': No such file or directory(实测复现过)。处理:先 mkdir -p /usr/share/binfmts 再 dpkg --configure -a 修复,之后重新执行安装命令即可。详见"八、常见问题"。

三、版本选型说明

Anakia 不是独立发行的产品,它随 Apache Velocity 引擎发行包一起分发(velocity-1.7.jar 内的 org.apache.velocity.anakia 包)。官方归档站 https://archive.apache.org/dist/velocity/engine/ 2026-10 实测在架版本如下:

版本线在架版本是否含 Anakia说明
1.x1.0 ~ 1.7是(task 类在 velocity-<ver>.jar 内)1.7 为 1.x 最后一版,Anakia 随之停更
2.x2.0 ~ 2.4.1否(整个 anakia 包被移除)引擎现代化版本,不能用于 Anakia

关键差异:Anakia 只存在于 Velocity 1.x。要使用 Anakia 必须锁定 1.7(1.x 的最终修复版,2010 年发布后官方再无 1.x 更新);Velocity 2.x 面向模板引擎应用场景,发行包中没有 org.apache.velocity.anakia。因此本篇选型就是 Velocity 1.7,无需追踪新版本。

💡 技术拓展:Velocity 发行包里有两个主 jar——velocity-1.7.jar(仅引擎本体)与 velocity-1.7-dep.jar(引擎 + Velocity 自身运行依赖的聚合包)。实测 velocity-1.7-dep.jar 中并不包含 JDOM(org/jdom 类数为 0),而 Anakia 强依赖 JDOM,所以跑 Anakia 不能只放一个 dep jar,必须使用 velocity-1.7.jar + lib/ 目录依赖 的组合。

发行包文件清单(1.7 目录实测在架):velocity-1.7.tar.gz、velocity-1.7.zip、velocity-1.7.jar、velocity-1.7-dep.jar、velocity-1.7-javadoc.jar、velocity-1.7-sources.jar、velocity-1.7.pom 及各自的 .asc/.md5/.sha1 校验与签名文件。

四、方案 A:apt 仓库在线安装(推荐)

方案 A 用 apt 安装 JDK 8 与 Ant 1.10.12,再部署 Velocity 1.7 发行包。适合可联网、用包管理器统一维护的机器。

4.1 安装 JDK 与 Ant

前置条件一节已通过 apt 装好 openjdk-8-jdk-headless 与 ant(1.10.12)。确认包版本与 JDK 主目录:

dpkg -l | grep -E '^ii  (ant |openjdk-8-jdk-headless)' | awk '{print $2, $3}'

回显(实测):

ant 1.10.12-1
openjdk-8-jdk-headless:amd64 8u504-ga-1ubuntu1~22.04.3
update-alternatives --list java

回显(实测,本机另装有 11 与 17 时为 3 条):

/usr/lib/jvm/java-11-openjdk-amd64/bin/java
/usr/lib/jvm/java-17-openjdk-amd64/bin/java
/usr/lib/jvm/java-8-openjdk-amd64/jre/bin/java

把系统默认 java 固定到 8(Anakia 场景推荐 JDK 8;实测 11/17 也能跑通,但老发行包在 JDK 8 上行为最稳):

update-alternatives --set java /usr/lib/jvm/java-8-openjdk-amd64/jre/bin/java
update-alternatives --set javac /usr/lib/jvm/java-8-openjdk-amd64/bin/javac
java -version 2>&1 | head -1

回显(实测):

update-alternatives: using /usr/lib/jvm/java-8-openjdk-amd64/jre/bin/java to provide /usr/bin/java (java) in manual mode
update-alternatives: using /usr/lib/jvm/java-8-openjdk-amd64/bin/javac to provide /usr/bin/javac (javac) in manual mode
openjdk version "1.8.0_504"

4.2 部署 Velocity 1.7 发行包

下载、校验、解压到 /opt/velocity-1.7:

mkdir -p /opt/software && cd /opt/software
wget https://archive.apache.org/dist/velocity/engine/1.7/velocity-1.7.tar.gz
wget https://archive.apache.org/dist/velocity/engine/1.7/velocity-1.7.tar.gz.md5
wget https://archive.apache.org/dist/velocity/engine/1.7/velocity-1.7.tar.gz.sha1
ls -la velocity-1.7.tar.gz

回显(实测):

-rw-r--r-- 1 root root 5882643 Jul  6  2020 velocity-1.7.tar.gz
-rw-r--r-- 1 root root      54 Jul  6  2020 velocity-1.7.tar.gz.md5
-rw-r--r-- 1 root root      68 Jul  6  2020 velocity-1.7.tar.gz.sha1

发行包自带 md5 与 sha1 两套校验(无 .sha512)。逐项核对:

md5sum -c velocity-1.7.tar.gz.md5
sha1sum -c velocity-1.7.tar.gz.sha1

回显(实测):

velocity-1.7.tar.gz: OK
velocity-1.7.tar.gz: OK

两个 OK 即校验通过(-c 能直接工作是因为官方校验文件带文件名格式)。解压并放到目标目录:

tar xzf velocity-1.7.tar.gz
mv velocity-1.7 /opt/velocity-1.7
ls /opt/velocity-1.7

回显(实测):

CONTRIBUTORS  LICENSE  NOTICE  README.txt  WHY_TWO_JARS.txt
build  docs  examples  lib  src  test  velocity-1.7-dep.jar  velocity-1.7.jar  xdocs

lib/ 是 Anakia 运行的关键依赖目录:

ls /opt/velocity-1.7/lib/ | grep jar

回显(实测):

antlr-2.7.5.jar
avalon-logkit-2.1.jar
commons-collections-3.2.1.jar
commons-lang-2.4.jar
commons-logging-1.1.jar
jdom-1.0.jar
log4j-1.2.12.jar
maven-ant-tasks-2.0.9.jar
oro-2.0.8.jar
servletapi-2.3.jar
werken-xpath-0.9.4.jar

其中 jdom-1.0.jar(XML 解析)、commons-collections-3.2.1.jar、commons-lang-2.4.jar(引擎依赖)、werken-xpath-0.9.4.jar(模板里 $xpath 工具)是 Anakia 的核心依赖;其余为引擎日志、正则等支撑依赖。

4.3 验证 Anakia task 可用

Anakia 的全部类都在 velocity-1.7.jar 内。先确认 jar 里确实带 AnakiaTask:

jar tf /opt/velocity-1.7/velocity-1.7.jar | grep anakia

回显(实测):

org/apache/velocity/anakia/
org/apache/velocity/anakia/AnakiaElement.class
org/apache/velocity/anakia/AnakiaJDOMFactory.class
org/apache/velocity/anakia/AnakiaTask$Context.class
org/apache/velocity/anakia/AnakiaTask.class
org/apache/velocity/anakia/Escape.class
org/apache/velocity/anakia/NodeList$1.class
org/apache/velocity/anakia/NodeList$AttributeXMLOutputter.class
org/apache/velocity/anakia/NodeList.class
org/apache/velocity/anakia/OutputWrapper.class
org/apache/velocity/anakia/TreeWalker.class
org/apache/velocity/anakia/XPathCache.class
org/apache/velocity/anakia/XPathTool.class

再做一次加载级验证:写一个最小 build.xml,注册 taskdef 后执行一个空 <anakia/>。若类加载成功,会走到属性校验并报 destdir attribute must be set!;若类路径不对,报的则是 taskdef 类找不到错误——两种报错可以精确区分"环境没装好"与"构建文件没写好":

mkdir -p /opt/anakia-demo && cat > /opt/anakia-demo/verify-taskdef.xml << 'EOF'
<?xml version="1.0" encoding="UTF-8"?>
<project name="verify" default="check" basedir=".">
    <path id="anakia.classpath">
        <pathelement location="/opt/velocity-1.7/velocity-1.7.jar"/>
        <fileset dir="/opt/velocity-1.7/lib">
            <include name="*.jar"/>
        </fileset>
    </path>
    <target name="check">
        <taskdef name="anakia"
                 classname="org.apache.velocity.anakia.AnakiaTask"
                 classpathref="anakia.classpath"/>
        <anakia/>
    </target>
</project>
EOF
cd /opt/anakia-demo && ant -f verify-taskdef.xml

回显(实测):

Buildfile: /opt/anakia-demo/verify-taskdef.xml

check:

BUILD FAILED
/opt/anakia-demo/verify-taskdef.xml:9: destdir attribute must be set!

Total time: 0 seconds

报错出自第 9 行 <anakia/> 的属性校验,说明 AnakiaTask 类已通过 classpath 成功加载并实例化——环境安装全部就绪。完整的 XML→HTML 转换示例见《Apache Anakia 快速入门与集成示例》。

五、方案 B:官方 tar.gz 安装 Ant 1.10.18(离线/新版本需求)

apt 仓库的 Ant 版本可能落后于官方线。方案 B 直接使用 Apache 官方 tar.gz 安装最新 Ant 1.10.18,适合内网分发(提前下载好包)或需要新版本特性的场景。JDK 部分与方案 A 相同,本节不再重复。

5.1 下载与校验

cd /opt/software
wget https://archive.apache.org/dist/ant/binaries/apache-ant-1.10.18-bin.tar.gz
wget https://archive.apache.org/dist/ant/binaries/apache-ant-1.10.18-bin.tar.gz.sha512
ls -la apache-ant-1.10.18*

回显(实测):

-rw-r--r-- 1 root root 7133405 Sep  6 17:33 apache-ant-1.10.18-bin.tar.gz
-rw-r--r-- 1 root root     129 Sep  6 17:33 apache-ant-1.10.18-bin.tar.gz.sha512

官方 .sha512 是 129 字节的裸哈希文本,用比对法校验:

[ "$(sha512sum apache-ant-1.10.18-bin.tar.gz | awk '{print $1}')" = "$(tr -d ' \n' < apache-ant-1.10.18-bin.tar.gz.sha512)" ] && echo "sha512 OK"

回显(实测):

sha512 OK

5.2 解压安装与 PATH 配置

tar xzf apache-ant-1.10.18-bin.tar.gz -C /opt
ls /opt/apache-ant-1.10.18

回显(实测):

CONTRIBUTORS  INSTALL  KEYS  LICENSE  NOTICE  README  WHATSNEW
bin  contributors.xml  etc  lib  manual  fetch.xml  get-m2.xml

把 tar 版 Ant 的 bin 目录加进 PATH(写入 /etc/profile.d 使所有登录会话生效)。注意 tar 版目录名与 apt 不同,先看 PATH 里谁排前面:

cat > /etc/profile.d/ant1818.sh << 'EOF'
export ANT_HOME=/opt/apache-ant-1.10.18
export PATH=$ANT_HOME/bin:$PATH
EOF
chmod +x /etc/profile.d/ant1818.sh
source /etc/profile.d/ant1818.sh
which ant
ant -version

回显(实测):

/opt/apache-ant-1.10.18/bin/ant
Apache Ant(TM) version 1.10.18 compiled on September 3 2026

5.3 验证 tar 版 Ant 能加载 Anakia

/opt/apache-ant-1.10.18/bin/ant -f /opt/anakia-demo/verify-taskdef.xml

回显(实测):

Buildfile: /opt/anakia-demo/verify-taskdef.xml

check:

BUILD FAILED
/opt/anakia-demo/verify-taskdef.xml:9: destdir attribute must be set!

Total time: 0 seconds

同样是属性校验报错,说明 1.10.18 也能正常加载 Anakia task。

六、方案对比与选择建议

维度方案 A:apt 在线安装方案 B:官方 tar.gz
JDKopenjdk-8-jdk-headless(8u504)同左(JDK 部分两方案相同)
Ant 版本1.10.121.10.18(当前官方最新线)
是否需联网安装时需要下载时需要,包可离线分发
升级方式apt upgrade 跟随仓库重新下载新 tar 包覆盖
卸载方式apt-get purge删目录 + 删 profile 脚本
适用场景常规联网服务器、统一运维版本敏感、内网离线、多机分发

选择建议:常规场景选方案 A,包管理器统一管理最省心;需要最新 Ant 或内网批量部署选方案 B。两方案的 Anakia 环境验证方式完全一致(verify-taskdef.xml)。

七、配置说明

配置项位置说明
系统默认 javaupdate-alternatives --set java ...apt 装多个 JDK 后手动固定;java -version 验证
ANT_HOME(方案 B)/etc/profile.d/ant1818.shtar 版 Ant 根目录,脚本启动时用于定位 lib
Anakia 类路径build.xml 内 <path id="anakia.classpath">必须包含 velocity-1.7.jar 与 lib/ 下依赖,写法见 4.3
velocity.properties默认在执行 ant 命令的当前目录Anakia 的引擎参数文件;用 templatePath 时可不提供
输出编码velocity.properties 的 output.encoding默认 ISO-8859-1,中文环境建议显式设 UTF-8

关键点:Anakia 没有常驻服务与全局配置文件,它的所有"配置"都落在每个工程的 build.xml 与 velocity.properties 中。JVM 堆参数同样在 ant 命令行通过 ANT_OPTS 传入(如 ANT_OPTS="-Xms256m -Xmx512m" ant docs),文档转换属于短时批处理任务,默认堆足够。

八、常见问题(FAQ)

Q1:安装 OpenJDK 时报 update-alternatives error creating symbolic link '/usr/share/binfmts/jar.dpkg-tmp'? 实测报错原文:

update-alternatives: error: error creating symbolic link '/usr/share/binfmts/jar.dpkg-tmp': No such file or directory
dpkg: error processing package openjdk-11-jre-headless:amd64 (--configure):
 installed openjdk-11-jre-headless:amd64 package post-installation script subprocess returned error exit status 2

原因:系统缺少 /usr/share/binfmts 目录,OpenJDK 包后置脚本建 binfmt 注册链接时失败。解决(实测有效):

mkdir -p /usr/share/binfmts
DEBIAN_FRONTEND=noninteractive dpkg --configure -a
DEBIAN_FRONTEND=noninteractive apt-get install -y openjdk-8-jdk-headless ant wget curl unzip

修复后安装正常完成,java -version 正常输出。

Q2:系统装了多个 JDK,ant 运行时用的哪一个? Debian/Ubuntu 的 ant 启动脚本按 JAVA_HOME → 默认 JDK 链的顺序解析。不设 JAVA_HOME 时跟随 update-alternatives 当前指向。可用 ant -v 第一行确认(实测输出 Detected Java version: 17 in: /usr/lib/jvm/java-17-openjdk-amd64 即当前用 17)。临时指定单次运行用环境变量前缀:JAVA_HOME=/usr/lib/jvm/java-8-openjdk-amd64 ant docs(实测有效)。

Q3:只把 velocity-1.7-dep.jar 放上 classpath 为什么不行? velocity-1.7-dep.jar 是引擎自身的聚合包,实测其中 org/jdom 类数为 0,而 Anakia 解析 XML 依赖 JDOM。taskdef 加载 AnakiaTask 类时不会立刻报错(AnakiaTask 本体在 dep jar 里),但执行转换时报 java.lang.NoClassDefFoundError: org/jdom/Element 类错误。正确做法:classpath 同时含 velocity-1.7.jar 与发行包 lib/ 目录全部 jar(4.3 的 path 写法)。

Q4:archive.apache.org 下载慢或中断怎么办? 归档站对国内直连偶发慢速。可用 wget 断点续传重试:wget -c <URL>;或改用与本篇相同的 md5/sha1 校验流程先下校验文件再核对。Velocity 1.7 属归档版本,各官方镜像站(如 downloads.apache.org 只放当前版本,1.7 只能走 archive.apache.org)——认准 archive.apache.org/dist/velocity/engine/1.7/ 这一个路径。

Q5:卸载 Ant tar 版后 which ant 还能找到旧版本? /etc/profile.d/ant1818.sh 把 tar 版 bin 放在 PATH 最前。卸载后未重新登录的会话仍缓存旧 PATH。执行 hash -r 或重新登录即可;确认 which ant 指向 /usr/bin/ant(apt 版)。

九、卸载与清理

apt 方案产物清理:

apt-get purge -y ant ant-optional

回显(实测,节选):

Removing ant-optional (1.10.12-1) ...
Removing ant (1.10.12-1) ...

tar 方案产物清理:

rm -f /etc/profile.d/ant1818.sh
rm -rf /opt/apache-ant-1.10.18

JDK 与 Velocity 发行包清理(确认无其他 Java 应用依赖后再删 JDK):

apt-get purge -y openjdk-8-jdk-headless
rm -rf /opt/velocity-1.7 /opt/anakia-demo /opt/software/velocity-1.7* /opt/software/apache-ant-1.10.18*

验证清理结果:

which ant java 2>&1; ls /opt/velocity-1.7 2>&1

回显(实测):

which: no ant in (/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin)
ls: cannot access '/opt/velocity-1.7': No such file or directory

ant 不在 PATH、目录不存在即清理干净。

十、参考链接