Apache Archiva 2.2.10 安装指南

Apache Archiva 2.2.10 安装指南:在 Ubuntu 22.04 上以 OpenJDK 8 从零部署 Archiva 仓库管理服务,覆盖 archive.apache.org 制品下载与 SHA256 校验、JSW wrapper 启停与状态、REST 初始化管理员并验证登录会话、systemd 托管与开机自启、JVM 堆 256-512MB 及 jps 实测复核,命令与回显均实测

Apache ArchivaArchiva2026/10/13

Apache Archiva 2.2.10 安装指南

目标:在 Ubuntu 22.04 服务器上从零安装 Apache Archiva 2.2.10(Maven 仓库管理器,提供代理仓库、托管仓库与制品检索),覆盖 JDK 8 前置、官方制品下载与 SHA256 校验、解压部署、JVM 堆 256-512MB 限制、首次启动、REST 初始化管理员、systemd 托管与开机自启。以下命令与回显均在 Ubuntu 22.04.5 真实环境逐步实测。

一、环境信息

  • 操作系统:Ubuntu 22.04.5 LTS(x86_64)
  • Java:OpenJDK 1.8.0_504(openjdk-8-jdk-headless;Archiva 2.2.x 基于 Jetty 8.1.14 + 老版 Servlet 栈,JDK 8 实测可用)
  • Apache Archiva:2.2.10(独立发行包 apache-archiva-2.2.10-bin.tar.gz,内嵌 Jetty)
  • 安装目录:/opt/archiva
  • 服务端口:8080(HTTP,Web 控制台 + REST API + 仓库代理下载)
  • 元数据库:内嵌 Apache Derby(derby-10.10.1.1,随包内置,零外部依赖),数据目录 /opt/archiva/data
  • 管理账号:admin / q1w2e3r4(首次启动后经 REST 或 Web 引导页初始化)
  • 运行用户:root

💡 说明:Apache Archiva 2.2.10 是该项目的最后一个发布版本,2024 年 11 月起项目已移入 Apache Attic(官方退役存档),官方下载站 downloads.apache.org 不再提供制品,只能从 archive.apache.org 归档站获取。已部署的存量实例仍可长期稳定运行,本文即以 2.2.10 为基准。

二、前置条件

  • 一台 Ubuntu 22.04 服务器,root 权限。
  • 安装 OpenJDK 8、wget、curl、net-tools、procps(含 jps)。
  • 磁盘:安装包约 68MB,解压后约 260MB,加上 Derby 元数据与仓库存储,预留 2GB 以上即可(仓库存储按实际代理/托管制品量增长)。
  • 内存:出厂 JVM 堆 512MB + PermGen 128MB,整机 1GB 以上可运行;本文按 256-512MB 堆配置(见 4.4),空载稳态内存约 430MB。

三、版本选型说明

截至本文实测(2026-10),Archiva 的可用制品仅存在于归档站 https://archive.apache.org/dist/archiva/2.2.10/binaries/:

制品说明
apache-archiva-2.2.10-bin.tar.gz独立发行包(内嵌 Jetty 8.1.14 + JSW wrapper),解压即用(本文采用)
apache-archiva-2.2.10.warWAR 包,供外置 Servlet 运行时部署,需自行适配依赖,本文不展开
.sha256 / .sha512对应制品的校验文件

关键差异:独立发行包自带启动脚本(Tanuki JSW wrapper 3.2.3)与全部运行库(lib 目录 34 个 jar,含 Jetty、Derby、tomcat-jdbc 连接池等),不依赖系统里预装的 Servlet 运行时,是存档版本下最省心的部署形态。新建环境选 bin.tar.gz 即可。

四、方案 A:归档站 tar.gz 在线下载安装(推荐)

4.1 安装 JDK 与基础工具

apt-get update -qq
DEBIAN_FRONTEND=noninteractive apt-get install -y \
    openjdk-8-jdk-headless wget curl net-tools procps

验证版本回显:

java -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)
readlink -f $(which java)
/usr/lib/jvm/java-8-openjdk-amd64/bin/java

即 JAVA_HOME 为 /usr/lib/jvm/java-8-openjdk-amd64(本文的独立包用 wrapper 启动,直接走 PATH 里的 java,无需显式配 JAVA_HOME)。

4.2 下载发行包并校验 SHA256

cd /opt
wget -O apache-archiva-2.2.10-bin.tar.gz \
  https://archive.apache.org/dist/archiva/2.2.10/binaries/apache-archiva-2.2.10-bin.tar.gz

下载完成核对文件(归档制品 mtime 固定为发布时间):

ls -l apache-archiva-2.2.10-bin.tar.gz
-rw-r--r-- 1 root root 68419100 Mar 16  2023 /opt/apache-archiva-2.2.10-bin.tar.gz
wget -q https://archive.apache.org/dist/archiva/2.2.10/binaries/apache-archiva-2.2.10-bin.tar.gz.sha256
echo "official: $(cat apache-archiva-2.2.10-bin.tar.gz.sha256)"
echo "actual:   $(sha256sum apache-archiva-2.2.10-bin.tar.gz | awk '{print $1}')"
official: 9d468f5cd3d7f6841e133e853fc24e73fb62397091f1bb3601b6f157a5eadf77  apache-archiva-2.2.10-bin.tar.gz
actual:   9d468f5cd3d7f6841e133e853fc24e73fb62397091f1bb3601b6f157a5eadf77

两值一致,制品完整。

4.3 解压部署到 /opt/archiva

cd /opt
tar -xzf apache-archiva-2.2.10-bin.tar.gz
mv apache-archiva-2.2.10 archiva
ls /opt/archiva/
LICENSE  NOTICE  apps  bin  conf  contexts  lib  logs  temp

查看 bin 与 conf 目录结构,确认启动脚本与配置文件:

ls /opt/archiva/bin/
ls /opt/archiva/conf/
archiva
archiva.bat
wrapper-linux-x86-32
wrapper-linux-x86-64
wrapper-macosx-universal-32
wrapper-macosx-universal-64
wrapper-solaris-sparc-32
wrapper-solaris-x86-64
wrapper-solaris-x86-32
wrapper-windows-x86-32.exe
wrapper-windows-x86-64.exe

archiva-cassandra.properties
archiva.xml
jetty.xml
shared.xml
wrapper.conf
文件/目录用途
bin/archiva服务管理脚本(console/start/stop/restart/status/dump),按平台调用 wrapper 原生程序
bin/wrapper-linux-x86-64JSW wrapper 原生二进制(Linux x86_64)
conf/wrapper.confJVM 与 wrapper 主配置(classpath、堆参数、日志滚动等)
conf/jetty.xml内嵌 Jetty 配置(监听端口/主机、连接器参数)
conf/archiva.xmlArchiva 应用配置(仓库扫描文件类型、仓库与远程仓库持久化、URL 失败缓存)
conf/shared.xml公共配置占位(出厂为空 <configuration />)
conf/archiva-cassandra.propertiesCassandra 会话工厂参数(默认会话工厂为 jcr,此文件仅在切换时使用)
apps/archiva/Web 应用本体
data/(首启生成)databases(Derby 元数据)、jcr(内容索引)、remotes、users

4.4 JVM 堆内存限制(256-512MB)

出厂 JVM 堆为初始 512MB / 最大 512MB(conf/wrapper.conf 的 wrapper.java.initmemory / wrapper.java.maxmemory),另有 -XX:MaxPermSize=128m。小规格服务器将初始堆降到 256MB:

sed -i 's/^wrapper.java.initmemory=512/wrapper.java.initmemory=256/' /opt/archiva/conf/wrapper.conf
grep -E 'initmemory|maxmemory|MaxPermSize' /opt/archiva/conf/wrapper.conf
wrapper.java.additional.8=-XX:MaxPermSize=128m
wrapper.java.initmemory=256
wrapper.java.maxmemory=512
参数出厂值本文值说明
wrapper.java.initmemory512256初始堆,wrapper 拼为 -Xms{n}m
wrapper.java.maxmemory512512最大堆,拼为 -Xmx{n}m;空仓库/小规模场景 512MB 足够
wrapper.java.additional.8-XX:MaxPermSize=128m不变永久代上限(JDK 8 下该参数已被标记过时但仍生效)

启动后用 jps -v 验证实际生效值(见 4.5 末尾)。

4.5 首次启动并验证

启动服务(脚本内部已切换工作目录到安装根,任意目录可执行):

cd /opt/archiva && ./bin/archiva start
Starting Apache Archiva...

查看运行状态(括号内为 wrapper 进程号):

./bin/archiva status
Apache Archiva is running (27536).

确认端口监听(启动完成约 10-20 秒):

netstat -tlnp | grep 8080
tcp6       0      0 :::8080                 :::*                    LISTEN      27536/java

用 jps -v 验证 JVM 堆实际生效值:

jps -v | grep WrapperSimpleApp | grep -oE '\-Xms[0-9]+m \-Xmx[0-9]+m'
-Xms256m -Xmx512m

命令行验证首页与免登录 ping 接口(必须带 Origin 头,原因见 8.1):

curl -s -o /dev/null -w '%{http_code}\n' http://localhost:8080/
curl -s http://localhost:8080/ | grep -oE '<title>[^<]*</title>'
curl -s -H 'Origin: http://localhost:8080' \
  http://localhost:8080/restServices/archivaServices/pingService/ping
200
<title>Apache Archiva</title>
Yeah Baby It rocks!

Yeah Baby It rocks! 是 Archiva 官方设定的 ping 固定应答,出现即 REST 栈就绪。浏览器访问 http://<服务器IP>:8080/ 进入 Web 控制台。

4.6 初始化管理员账号

Archiva 首次部署没有管理员账号(浏览器打开控制台会进入初始化引导页)。命令行侧等价操作是调用 Redback 的 createAdminUser 接口:

curl -s -X POST -H 'Content-Type: application/json' -H 'Accept: application/json' \
  -H 'Origin: http://localhost:8080' \
  -d '{"username":"admin","password":"q1w2e3r4","confirmPassword":"q1w2e3r4","fullName":"Archiva Administrator","email":"admin@example.org","validated":true,"permanent":true}' \
  http://localhost:8080/restServices/redbackServices/userService/createAdminUser
true

复核管理员已存在:

curl -s -H 'Origin: http://localhost:8080' \
  http://localhost:8080/restServices/redbackServices/userService/isAdminUserExists
true

登录获取会话(凭据必须走 JSON 体,HTTP Basic 方式实测报错,见 8.2):

curl -s -X POST -H 'Content-Type: application/json' -H 'Accept: application/json' \
  -H 'Origin: http://localhost:8080' -c /tmp/archiva-cookie.txt \
  -d '{"username":"admin","password":"q1w2e3r4"}' \
  http://localhost:8080/restServices/redbackServices/loginService/logIn
{"username":"admin","fullName":"Archiva Administrator","email":"admin@example.org","assignedRoles":[...],"validationToken":"hj5rr9jX6g2MEX..."}

携带会话 Cookie + CSRF Token 访问受保护接口(列出内置仓库):

TOKEN=$(grep -oP '(?<="validationToken":")[^"]+' /tmp/login.json)
curl -s -b /tmp/archiva-cookie.txt -H 'Origin: http://localhost:8080' -H "X-XSRF-TOKEN: $TOKEN" \
  http://localhost:8080/restServices/archivaServices/managedRepositoriesService/getManagedRepositories
[{"id":"internal",...,"location":"/opt/archiva/repositories/internal",...},{"id":"snapshots",...,"location":"/opt/archiva/repositories/snapshots",...}]

返回 internal 与 snapshots 两个内置仓库即初始化完成。到此方案 A 安装完成;若需开机自启,继续 4.7 的 systemd 托管。

4.7 systemd 托管

先停掉脚本方式启动的进程,再交给 systemd 管理:

cd /opt/archiva && ./bin/archiva stop && ./bin/archiva status
Stopping Apache Archiva...
Stopped Apache Archiva.
Apache Archiva is not running.

编写服务单元 /etc/systemd/system/archiva.service(pid 文件由 wrapper 写到 logs/archiva.pid):

cat > /etc/systemd/system/archiva.service <<'EOF'
[Unit]
Description=Apache Archiva Repository Manager (Jetty standalone)
After=network.target

[Service]
Type=forking
ExecStart=/opt/archiva/bin/archiva start
ExecStop=/opt/archiva/bin/archiva stop
PIDFile=/opt/archiva/logs/archiva.pid
LimitNOFILE=65536
TimeoutStartSec=180
Restart=on-failure
RestartSec=30

[Install]
WantedBy=multi-user.target
EOF
配置项说明
Type=forkingbin/archiva start 拉起 wrapper 后台进程后退出,属 fork 型
PIDFile=/opt/archiva/logs/archiva.pidwrapper 记录主进程号的位置(脚本内 PIDDIR="$BASEDIR/logs")
Restart=on-failure / RestartSec=30异常退出 30 秒后自动拉起
LimitNOFILE=65536提高文件句柄上限,避免仓库制品多时报 too many open files
TimeoutStartSec=180首次启动含 Derby 建库,放宽启动超时

启用并启动:

systemctl daemon-reload
systemctl enable archiva
systemctl start archiva && sleep 15
systemctl is-active archiva
Created symlink /etc/systemd/system/multi-user.target.wants/archiva.service → /etc/systemd/system/archiva.service.
active

systemd 托管下复核 JVM 堆与 REST:

systemctl status archiva --no-pager -n 0 | head -6
jps -v | grep WrapperSimpleApp | grep -oE '\-Xms[0-9]+m \-Xmx[0-9]+m'
curl -s -H 'Origin: http://localhost:8080' \
  http://localhost:8080/restServices/archivaServices/pingService/ping
● archiva.service - Apache Archiva Repository Manager (Jetty standalone)
     Loaded: loaded (/etc/systemd/system/archiva.service; enabled; vendor preset: enabled)
     Active: active (running) since Tue 2026-10-13 07:11:33 UTC; 15s ago
   Main PID: 26946 (wrapper-linux-x)
     Tasks: 109
     Memory: 428.7M
-Xms256m -Xmx512m
Yeah Baby It rocks!

重启后再次验证管理员数据持久化(元数据已落 /opt/archiva/data/databases 的 Derby 库,重启不丢):

curl -s -H 'Origin: http://localhost:8080' \
  http://localhost:8080/restServices/redbackServices/userService/isAdminUserExists
true

五、方案 B:离线包安装(内网服务器)

内网服务器无法直连归档站时,先在任一台可联网机器上下载好全套制品,再拷贝到目标服务器安装。

5.1 在可联网机器上下载制品

mkdir -p archiva-offline && cd archiva-offline
wget -q https://archive.apache.org/dist/archiva/2.2.10/binaries/apache-archiva-2.2.10-bin.tar.gz
wget -q https://archive.apache.org/dist/archiva/2.2.10/binaries/apache-archiva-2.2.10-bin.tar.gz.sha256
apt-get download openjdk-8-jdk-headless
ls -l
-rw-r--r-- 1 root root 68419100 apache-archiva-2.2.10-bin.tar.gz
-rw-r--r-- 1 root root      81 apache-archiva-2.2.10-bin.tar.gz.sha256
-rw-r--r-- 1 root root 41759284 openjdk-8-jdk-headless_8u504-ga-1ubuntu1~22.04.3_amd64.deb

⚠️ JDK deb 的小版本号随系统更新变化,以 apt download openjdk-8-jdk-headless 在同版本系统上取到的实际文件名为准;该命令只下载不安装。

5.2 传输并校验

拷贝到内网目标服务器后,先核对 SHA256:

cd /opt/install
echo "official: $(cat apache-archiva-2.2.10-bin.tar.gz.sha256)"
echo "actual:   $(sha256sum apache-archiva-2.2.10-bin.tar.gz | awk '{print $1}')"
official: 9d468f5cd3d7f6841e133e853fc24e73fb62397091f1bb3601b6f157a5eadf77  apache-archiva-2.2.10-bin.tar.gz
actual:   9d468f5cd3d7f6841e133e853fc24e73fb62397091f1bb3601b6f157a5eadf77

5.3 离线安装 JDK

apt-get install -y ./openjdk-8-jdk-headless_*.deb
java -version
openjdk version "1.8.0_504"
...

💡 apt-get install ./xxx.deb 会自动解析 deb 的依赖(openjdk-8-jre-headless 等);若目标机没有内网 apt 源,把依赖 deb 一并拷来 dpkg -i 安装。

5.4 解压与配置(与方案 A 相同)

解压、JVM 堆限制、启动、初始化管理员、systemd 托管与方案 A 的 4.3、4.4、4.5、4.6、4.7 步骤逐条相同,按其执行即可。核心差异只有下载环节:由「服务器直连归档站」换为「离线拷贝 + SHA256 校验」,其余命令与回显完全一致。

六、方案对比与选择建议

维度方案 A:在线 tar.gz方案 B:离线包
版本2.2.10(独立包)2.2.10(独立包)
需联网服务器需访问 archive.apache.org仅中转机联网
安装方式wget 下载 + SHA256 校验 + tar 解压拷贝传输 + 校验 + 解压
systemd 来源手写单元文件 archiva.service同左
监听端口8080同左
优点步骤最少内网可交付、制品可留档复用

选择建议:可联网环境直接用方案 A;内网隔离、批量交付或多台同版本部署时用方案 B。两方案产物一致,后续配置、升级方式完全相同。

七、配置说明

本节汇总安装相关的常用配置项位置,详细参数含义见《Apache Archiva 2.2.10 配置参数详解》。

配置文件位置本文取值
监听端口conf/jetty.xml 连接器(jetty.port 系统属性,默认 8080)8080
JVM 堆conf/wrapper.conf 的 initmemory/maxmemory256 / 512
仓库存储位置REST/控制台管理,落盘 /opt/archiva/repositories/internal、snapshots(内置)
元数据库内嵌 Derby,/opt/archiva/data/databases出厂默认
日志/opt/archiva/logs/(archiva.log、wrapper-日期.log、request-日期.log、archiva-audit.log)出厂默认
systemd/etc/systemd/system/archiva.serviceType=forking

修改任一配置后需重启服务生效:systemctl restart archiva。

八、常见问题

8.1 调 REST 接口一律 403

现象:curl http://localhost:8080/restServices/... 返回 403 Forbidden 且响应体为空。

定位:Archiva 的 Redback 安全层启用 CSRF 校验,REST 请求必须携带 Origin 头;不带直接拒绝。

解决:补 Origin 头(值与访问主机端口一致即可),实测前后对比:

curl -s -o /dev/null -w '%{http_code}\n' \
  http://localhost:8080/restServices/archivaServices/pingService/ping
curl -s -o /dev/null -w '%{http_code}\n' -H 'Origin: http://localhost:8080' \
  http://localhost:8080/restServices/archivaServices/pingService/ping
403
200

8.2 登录接口报 incorrect.username.password

现象:用 -u admin:q1w2e3r4(HTTP Basic)调用 loginService/logIn 返回 500:

{"errorMessages":[{"errorKey":"incorrect.username.password","args":[],"message":null}]}

定位:Redback 的登录接口不接受 Basic 认证,凭据必须放在 JSON 请求体里。

解决:按 4.6 的方式用 -d '{"username":"admin","password":"..."}' POST 登录;账号密码确认无误后仍报错,多为把该接口当成了 Basic 端点。

8.3 修改监听端口(8080 → 其他)

定位:端口由 Jetty 连接器从系统属性 jetty.port 读取(默认 8080,见 conf/jetty.xml)。给 wrapper 追加一行 JVM 参数即可覆盖:

sed -i 's/^wrapper.java.additional.8=-XX:MaxPermSize=128m/wrapper.java.additional.8=-XX:MaxPermSize=128m\nwrapper.java.additional.9=-Djetty.port=9080/' /opt/archiva/conf/wrapper.conf
systemctl restart archiva && sleep 15
netstat -tlnp | grep 9080
curl -s -o /dev/null -w '%{http_code}\n' http://localhost:9080/
tcp6       0      0 :::9080                 :::*                    LISTEN      27278/java
200

改回时删除 wrapper.java.additional.9 行并重启即可。改端口后 REST 的 Origin 头值同步换成新端口(-H 'Origin: http://localhost:9080' 实测 ping 返回 Yeah Baby It rocks!)。

8.4 启动即退出或响应极慢

定位:常见三类根因——堆超过物理内存(出厂 512MB 堆 + 128MB PermGen,最低 1GB 内存机器)、JDK 版本过高(JDK 11+ 下老 Jetty/JSP 编译不兼容,实测 JDK 8 可用)、Derby 库目录权限异常。查看 wrapper 日志定位:

tail -30 /opt/archiva/logs/wrapper-$(date +%Y%m%d).log
tail -30 /opt/archiva/logs/archiva.log

8.5 新建仓库 location 写相对路径落错位置

现象:REST/控制台建仓时 location 填 ./repositories/thirdparty,实际目录出现在 /opt/archiva/repositories/repositories/thirdparty(多了一层)。

定位:2.2.10 对相对路径的解析以 repositories 根为基准拼接,不做归一化。

解决:建仓时 location 一律写绝对路径(如 /opt/archiva/repositories/thirdparty),实测落位正确。

8.6 jps 命令不存在

定位:jps 属 JDK 工具,只装 JRE 时没有。

解决:安装 openjdk-8-jdk-headless(含 jps),或用 ps -ef | grep WrapperSimpleApp 替代查看进程。

九、卸载与清理

先停服务并取消自启:

systemctl stop archiva
systemctl disable archiva
Removed "/etc/systemd/system/multi-user.target.wants/archiva.service".

删除服务单元、安装目录与数据:

rm -f /etc/systemd/system/archiva.service
systemctl daemon-reload
rm -rf /opt/archiva /opt/apache-archiva-2.2.10-bin.tar.gz /opt/apache-archiva-2.2.10-bin.tar.gz.sha256

⚠️ rm -rf /opt/archiva 会同时删除仓库存储(repositories/)与 Derby 元数据(data/);若有已托管的制品需要保留,先备份这两个目录再卸载。

如需一并卸载 JDK:

apt-get purge -y openjdk-8-jdk-headless openjdk-8-jre-headless && apt-get autoremove -y

十、参考链接