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 查询实测。

Apache JenaApache Jena安装部署JavaApacheUbuntu 22.042026/10/11

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.gzbin/ 下大量命令行工具(sparql、riot、tdb2.* 等)命令行处理 RDF、批量加载/查询 TDB 数据库
apache-jena-fuseki-6.2.0.tar.gzfuseki-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" ] .

⚠️ 说明:

  1. 数据集类型必须写 tdb2:DatasetTDB2(TDB2 的 assembler 类型常量,不是 tdb2:TDB2Dataset),否则报 NoSpecificTypeException。
  2. 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、Fuseki run/ 需单独评估是否保留,删除前请先备份 TDB 数据。

9.3 可选卸载 JDK

DEBIAN_FRONTEND=noninteractive apt-get purge -y openjdk-21-jdk-headless
apt-get autoremove -y

十、参考链接