Ubuntu 22.04 安装 Apache Jena 6.2.0 指南
Ubuntu 22.04 上文从零安装 Apache Jena 6.2.0(Jena 命令行框架与 Apache Jena Fuseki 服务器),覆盖 JDK 21 配置、tar.gz 校验解压、Fuseki 数据集创建与 SPARQL 查询实测。
Ubuntu 22.04 安装 Apache Jena 6.2.0 指南
目标:带领读者在 Ubuntu 22.04(x86_64)上从零到一完整部署 Apache Jena 6.2.0——包括 Jena 命令行框架与 Apache Jena Fuseki 独立服务器,覆盖 JDK 安装、官方包下载校验、环境变量配置、Fuseki 启动与数据集 SPARQL 查询。文中所有命令回显均在本次实测环境中逐条照抄,版本号、端口、路径均来自真实环境。
一、环境信息
- 操作系统:Ubuntu 22.04.5 LTS(GNU/Linux x86_64)
- JDK:OpenJDK 21(
21.0.12.1,由openjdk-21-jdk-headless安装),JAVA_HOME=/usr/lib/jvm/java-21-openjdk-amd64 - Apache Jena 框架版本:6.2.0(
JENA_HOME=/usr/local/apache-jena-6.2.0) - Apache Jena Fuseki 版本:6.2.0(
FUSEKI_HOME=/usr/local/apache-jena-fuseki-6.2.0) - Fuseki 监听端口:3030(默认)
- 数据目录(Jena 命令行 TDB):
/opt/data/jena/db/hello - Fuseki 运行目录:
/usr/local/apache-jena-fuseki-6.2.0/run - Fuseki 管理账号:
admin/ 密码q1w2e3r4 - 下载源:Apache 官方 CDN
https://dlcdn.apache.org/jena/binaries/
⚠️ 说明:本环境处于内网隔离区时,
dlcdn.apache.org可能不可达,可改从https://archive.apache.org/dist/jena/下载同名归档(归档目录结构相同)。
二、前置条件
- 一台运行 Ubuntu 22.04 的 64 位服务器,具备
root权限; - 已配置 apt 软件源,可执行
apt-get update; - 物理机建议内存 ≥ 2 GB(本文档 Fuseki 进程按 256 MB 堆运行);
- 服务器可访问外网,用于下载 Apache 官方发布包。
2.1 检查系统与包管理工具
cat /etc/os-release
回显(节选):
PRETTY_NAME="Ubuntu 22.04.5 LTS"
NAME="Ubuntu"
VERSION_ID="22.04"
which apt-get
回显:
/usr/bin/apt-get
三、版本选型说明
Apache Jena 各版本一直在演进,选型需同时确认「Jena 框架版本」与「Java 运行时最低版本」匹配关系。Jena 6.2.0 的二进制只兼容 Java 21 及以上(编译 class 版本 65.0),下面给出实测对照表。
3.1 JDK / Jena 版本对照表(实测)
| Jena 主版本 | JDK 运行时要求 | 实测结果 |
|---|---|---|
| Jena 6.2.0 及以上 | Java 21+ | JDK 17 报 UnsupportedClassVersionError(class 版本 65.0),JDK 21 正常 |
| Jena 4.x / 5.x 早期 | Java 17 | 兼容 Java 11/17,但不支持最新功能 |
因此本文采用 JDK 21 + Jena 6.2.0 组合。
3.2 两个分发包的分工
| 发布包 | 内容 | 用途 |
|---|---|---|
apache-jena-6.2.0.tar.gz | bin/ 下大量命令行工具(sparql、riot、tdb2.* 等) | 命令行处理 RDF、批量加载/查询 TDB 数据库 |
apache-jena-fuseki-6.2.0.tar.gz | fuseki-server 独立 SPARQL 服务器 + Web 管理台 | 提供 HTTP SPARQL Query / Update 服务 |
💡 说明:若只需命令行处理 RDF,可只装
apache-jena;若要对外提供 SPARQL 服务,需额外安装apache-jena-fuseki。
四、部署步骤
本方案为「官方 tar.gz 二进制」安装,无需编译。
4.1 安装 OpenJDK(Jena 6.2.0 需要 JDK 21)
apt-get update -qq
apt-cache policy openjdk-21-jdk-headless
回显(确认候选版本):
openjdk-21-jdk-headless:
Installed: (none)
Candidate: 21.0.12.1+1-1~22.04.4
DEBIAN_FRONTEND=noninteractive apt-get install -y openjdk-21-jdk-headless wget curl
⚠️ 说明:Jena 6.2.0 需要 Java 21。若先装了 JDK 17,运行 Jena 命令会报
UnsupportedClassVersionError,详见「八、常见问题」。
确认 java 指向 JDK 21:
readlink -f $(which java)
回显:
/usr/lib/jvm/java-21-openjdk-amd64/bin/java
java -version
回显:
openjdk version "21.0.12.1" 2026-08-18
OpenJDK Runtime Environment (build 21.0.12.1+1-1~22.04.4-Ubuntu)
OpenJDK 64-Bit Server VM (build 21.0.12.1+1-1~22.04.4-Ubuntu, mixed mode, sharing)
4.2 从 Apache 官方下载两份 tar.gz
在 /usr/local 下执行(官方 CDN 地址):
cd /usr/local
wget https://dlcdn.apache.org/jena/binaries/apache-jena-6.2.0.tar.gz
wget https://dlcdn.apache.org/jena/binaries/apache-jena-fuseki-6.2.0.tar.gz
回显(文件大小):
-rw-r--r-- 1 root root 23986647 Jul 27 16:15 apache-jena-6.2.0.tar.gz
-rw-r--r-- 1 root root 51398669 Jul 27 16:15 apache-jena-fuseki-6.2.0.tar.gz
4.3 校验 SHA512 完整性(官方提供 .sha512)
cd /usr/local
wget https://dlcdn.apache.org/jena/binaries/apache-jena-6.2.0.tar.gz.sha512
wget https://dlcdn.apache.org/jena/binaries/apache-jena-fuseki-6.2.0.tar.gz.sha512
sha512sum apache-jena-6.2.0.tar.gz apache-jena-fuseki-6.2.0.tar.gz
回显(两份文件的 sha512sum 与官网 .sha512 文件完全一致):
2b467d2ff940c207aea935e012ecbb0f0ab3e6bf59b3fc4b3fbc6cf9cea11f1428e97882ec078a5ffc57e114e0f5c88ea98c4575e687cc1dd232f99324b7b2a2 apache-jena-6.2.0.tar.gz
ba65f5867d2d4741b2ed9e2af5a0d4fbb447909894ab2a0c6bc4dac8997f4fe339c87b13c48d45d054977769f0f8bf763ea346b1f7792d5cdc458041bd43a132 apache-jena-fuseki-6.2.0.tar.gz
4.4 解压至 /usr/local
cd /usr/local
tar xzf apache-jena-6.2.0.tar.gz
tar xzf apache-jena-fuseki-6.2.0.tar.gz
ls -d /usr/local/apache-jena-*
回显:
/usr/local/apache-jena-6.2.0
/usr/local/apache-jena-fuseki-6.2.0
Jena 命令行工具清单(节选,apache-jena-6.2.0/bin/ 下):
arq infer riot sparql rdfcat turtle update rdfpatch rdfcompare schemagen shacl shex
tdb2.tdbloader tdb2.tdbquery tdb2.tdbupdate tdb2.tdbstats tdb2.tdbdump tdb2.tdbbackup tdb2.tdbcompact
4.5 配置环境变量(写入 /etc/profile.d/jena.sh)
创建环境变量脚本,登入即可生效:
cat > /etc/profile.d/jena.sh <<'EOF'
export JAVA_HOME=/usr/lib/jvm/java-21-openjdk-amd64
export PATH=$JAVA_HOME/bin:$PATH
export JENA_HOME=/usr/local/apache-jena-6.2.0
export FUSEKI_HOME=/usr/local/apache-jena-fuseki-6.2.0
export PATH=$JENA_HOME/bin:$FUSEKI_HOME:$PATH
EOF
chmod +x /etc/profile.d/jena.sh
source /etc/profile.d/jena.sh
💡 说明:
source仅当前终端生效;重登或重启后login shell会自动加载/etc/profile.d/jena.sh。
4.6 验证命令行工具版本(逐条执行)
jena --version
回显:
openjdk 21.0.12.1 2026-08-18
OpenJDK Runtime Environment (build 21.0.12.1+1-1~22.04.4-Ubuntu)
OpenJDK 64-Bit Server VM (build 21.0.12.1+1-1~22.04.4-Ubuntu, mixed mode, sharing)
sparql --version
回显:
Apache Jena version 6.2.0
riot --version
回显:
Apache Jena RIOT version 6.2.0
五、配置说明
5.1 Fuseki 启动脚本与 JVM 堆内存限制
/usr/local/apache-jena-fuseki-6.2.0/fuseki-server 脚本第 97 行附近定义了 JVM 默认参数:
JVM_ARGS=${JVM_ARGS:--Xmx4G}
即默认允许 4 GB 堆内存。生产/测试环境应将堆限制在 256–512 MB。修改方式:在启动前通过环境变量 JVM_ARGS 覆盖,无需改动脚本本身:
export JVM_ARGS="-Xms256m -Xmx256m -Xmn128m"
⚠️ 说明:
-Xms256m(初始堆 256 MB)、-Xmx256m(最大堆 256 MB)、-Xmn128m(新生代 128 MB)。若需稍大内存可改为-Xms256m -Xmx512m。
5.2 编写 Fuseki 配置 config.ttl(定义数据集)
在 Fuseki 目录创建 config.ttl,声明一个挂载在 /hello 的 TDB2 持久数据集:
@prefix fuseki: <http://jena.apache.org/fuseki#> .
@prefix rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> .
@prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#> .
@prefix tdb2: <http://jena.apache.org/2016/tdb#> .
[] rdf:type fuseki:Server ;
fuseki:services ( <#service_hello> ) .
<#service_hello> rdf:type fuseki:Service ;
rdfs:label "hello-dataset" ;
fuseki:name "hello" ;
fuseki:endpoint [ fuseki:operation fuseki:query ] ;
fuseki:endpoint [ fuseki:operation fuseki:update ] ;
fuseki:endpoint [ fuseki:operation fuseki:gsp-rw ] ;
fuseki:dataset [ rdf:type tdb2:DatasetTDB2 ;
tdb2:location "/opt/data/jena/db/hello" ] .
⚠️ 说明:
- 数据集类型必须写
tdb2:DatasetTDB2(TDB2 的 assembler 类型常量,不是tdb2:TDB2Dataset),否则报NoSpecificTypeException。query/update/gsp-rw三个端点是独立的fuseki:endpoint对象;若写进同一个空白节点对象(使用;重复fuseki:operation),会报Multiple properties 'fuseki:operation'。
5.3 启动 Fuseki(含 admin 账号与 JVM 堆限制)
source /etc/profile.d/jena.sh
export JVM_ARGS="-Xms256m -Xmx256m -Xmn128m"
cd /usr/local/apache-jena-fuseki-6.2.0
nohup ./fuseki-server --config=config.ttl --admin=admin:q1w2e3r4 --port 3030 > /opt/data/jena/fuseki.log 2>&1 &
⚠️ 说明:
--admin=admin:q1w2e3r4指定 Fuseki 管理账号为admin、密码q1w2e3r4(本文演示账号)。--port 3030为默认端口。
查看启动日志确认(cat /opt/data/jena/fuseki.log):
11:14:37 INFO Fuseki :: Apache Jena Fuseki 6.2.0
11:14:38 INFO Config :: Fuseki Base = /usr/local/apache-jena-fuseki-6.2.0/run
11:14:38 INFO Config :: Database: /hello
11:14:39 INFO Server :: Path = /hello
11:14:39 INFO Server :: System
11:14:39 INFO Server :: Memory: 256.0 MiB
11:14:39 INFO Server :: PID: 6514
11:14:39 INFO Server :: Port: http=3030
11:14:39 INFO Server :: Start Fuseki
5.4 验证 JVM 堆配置已生效(jps -v)
jps -v | grep Fuseki
回显(可见 -Xms256m -Xmx256m -Xmn128m 已生效):
6514 FusekiServerUICmd -Xms256m -Xmx256m -Xmn128m -Dlog4j.configurationFile=/usr/local/apache-jena-fuseki-6.2.0/log4j2.properties
5.5 日志配置 log4j2
Fuseki 的日志由 FUSEKI_HOME/log4j2.properties 控制(默认 INFO 级别输出到控制台)。可通过环境变量 LOGGING 指定自定义日志文件:
export LOGGING="-Dlog4j.configurationFile=/opt/data/jena/custom-log4j2.properties"
💡 说明:不设置
LOGGING时自动使用FUSEKI_HOME/log4j2.properties(见fuseki-server脚本)。详见《Apache Jena 配置参数详解》篇 5 节。
六、升级、降级与多版本管理
6.1 升级
升级前先到官方下载页确认最新版本号(当前实测为 6.2.0,后续以官方发布为准):
curl -s https://dlcdn.apache.org/jena/binaries/ | grep -oE "apache-jena-fuseki-[0-9.]+tar.gz" | sort -u
# 1. 停止旧版 Fuseki
pkill -f fuseki-server
# 2. 备份原目录与数据
cp -a /usr/local/apache-jena-fuseki-6.2.0 /usr/local/apache-jena-fuseki-6.2.0.bak
cp -a /opt/data/jena /opt/data/jena.bak
# 3. 下载新版本(版本号 X.Y.Z 取自上一步官方页面输出)并解压
cd /usr/local
wget https://dlcdn.apache.org/jena/binaries/apache-jena-fuseki-X.Y.Z.tar.gz
tar xzf apache-jena-fuseki-X.Y.Z.tar.gz
# 4. 修改 /etc/profile.d/jena.sh 中的 FUSEKI_HOME 指向新目录后重启
source /etc/profile.d/jena.sh
⚠️ 说明:上例中
X.Y.Z为需要读者在步骤 1 查到的官方最新版本号(如 6.3.0);不要直接使用未确认的版本号下载。
TDB2 数据库向前兼容,一般可直接挂载旧数据目录。
6.2 降级与多版本并存
- 降级:将
FUSEKI_HOME指回旧版目录并重启即可;如数据格式不兼容,先tdb2.tdbbackup备份。 - 多版本并存:不同版本解压在各自目录(如
apache-jena-5.2.0与apache-jena-6.2.0并存),通过切换/etc/profile.d/jena.sh里的JENA_HOME/FUSEKI_HOME或每次都显式调用<目录>/bin/<命令>选择版本。
/usr/local/apache-jena-6.2.0/bin/sparql --version
/usr/local/apache-jena-5.2.0/bin/sparql --version
6.3 查看当前运行版本
curl -s http://127.0.0.1:3030/$/ping
回显(Fuseki 心跳时间戳,正常表示服务存活):
2026-10-11T11:17:01.823+00:00
七、注意事项
- JDK 版本必须匹配:Jena 6.2.0 需要 JDK 21+,否则
UnsupportedClassVersionError(见八、常见问题)。 - 默认堆过大:Fuseki 默认
-Xmx4G,务必通过JVM_ARGS限制在 256–512 MB。 - config.ttl 语法:
tdb2:DatasetTDB2类型名与独立fuseki:endpoint对象缺一不可。 - 持久化目录:Fuseki 数据默认落在
$FUSEKI_HOME/run/databases/;Jena 命令行 TDB 数据落在--loc指定目录。 - 同一数据集不可被命令线与服务器同时打开:Fuseki 运行期间对
/opt/data/jena/db/hello持锁,tdb2.tdbquery等命令线工具访问会报Failed to get a lock(见八、常见问题)。
八、常见问题(FAQ)
Q1:Jena 6.2.0 报错 UnsupportedClassVersionError(class file version 65.0)怎么解决?
现象:
Error: LinkageError occurred while loading main class arq.sparql
java.lang.UnsupportedClassVersionError: arq/sparql has been compiled by a more recent version of the Java Runtime (class file version 65.0), this version of the Java Runtime only recognizes class file versions up to 61.0
原因:Jena 6.2.0 以 Java 21 编译(class 版本 65.0),而运行时是 JDK 17(最高支持 61.0)。
解决:安装并使用 JDK 21,并把 JAVA_HOME 指向它:
DEBIAN_FRONTEND=noninteractive apt-get install -y openjdk-21-jdk-headless
export JAVA_HOME=/usr/lib/jvm/java-21-openjdk-amd64
export PATH=$JAVA_HOME/bin:$PATH
Q2:tdb2.tdbquery 报 Failed to get a lock: file=/opt/data/jena/db/hello/tdb.lock: held by process 6514?
原因:该 TDB 数据集正被 Fuseki 进程占用(Fuseki 持锁),命令行工具无法再打开同一目录。
解决:先停止 Fuseki 或用别的目录做命令行离线操作:
pkill -f fuseki-server
tdb2.tdbquery --loc=/opt/data/jena/db/hello --query=/opt/data/jena/q1.rq
Q3:启动时报 NoSpecificTypeException(root has no most specific type that is a subclass of ja:Object)?
原因:config.ttl 中数据集类型写错,使用了不存在的 tdb2:TDB2Dataset。
解决:改为 tdb2:DatasetTDB2 并重启。
Q4:--update 与 --config 一起用报错?
现象:
ERROR Fuseki :: --update and a configuration file does not make sense (control using the configuration file only)
原因:Fuseki 不允许同时传 --update 与 --config;更新权限由 config.ttl 中声明的 fuseki:endpoint [ fuseki:operation fuseki:update ] 控制。
解决:去掉 --update,仅用 --config。
九、卸载方式
9.1 停止服务
pkill -f fuseki-server
9.2 删除目录
rm -rf /usr/local/apache-jena-6.2.0
rm -rf /usr/local/apache-jena-fuseki-6.2.0
rm -f /etc/profile.d/jena.sh
⚠️ 说明:数据目录
/opt/data/jena、Fusekirun/需单独评估是否保留,删除前请先备份 TDB 数据。
9.3 可选卸载 JDK
DEBIAN_FRONTEND=noninteractive apt-get purge -y openjdk-21-jdk-headless
apt-get autoremove -y
十、参考链接
- Apache Jena 下载页:https://dlcdn.apache.org/jena/binaries/
- Apache Jena 镜像选择:https://www.apache.org/dyn/closer.cgi/jena
- Apache Jena 归档(旧版本):https://archive.apache.org/dist/jena/
- Apache Jena 官方文档:https://jena.apache.org/documentation/
- Apache Jena Fuseki 配置说明:https://jena.apache.org/documentation/fuseki2/