Apache Archiva 2.2.10 配置参数详解

Apache Archiva 2.2.10 配置参数详解:逐项解析 conf/wrapper.conf(JSW wrapper 与 JVM 堆 256-512MB、jetty.port 覆盖)、jetty.xml 连接器、archiva.xml(仓库扫描文件类型、URL 失败缓存、仓库持久化)与本地/远程仓库参数(调度 cron、清理策略、连通性检查),附生产模板与生效验证方法,默认值均实测

Apache ArchivaArchiva2026/10/13

Apache Archiva 2.2.10 配置参数详解

目标:详解 Apache Archiva 2.2.10 的核心配置——conf/wrapper.conf(JSW wrapper 与 JVM 参数,含堆 256-512MB 与端口覆盖)、conf/jetty.xml(连接器)、conf/archiva.xml(应用与仓库持久化)以及仓库参数(本地/远程仓库、调度与清理策略),并给出可直接套用的生产模板。参数与默认值均基于真实环境实测(Ubuntu 22.04 / OpenJDK 1.8.0_504)。

一、环境信息

  • 操作系统:Ubuntu 22.04.5 LTS(x86_64)
  • Java:OpenJDK 1.8.0_504
  • Apache Archiva:2.2.10(独立发行包,内嵌 Jetty 8.1.14.v20131031 + JSW wrapper 3.2.3)
  • 安装目录:/opt/archiva
  • 配置文件目录:/opt/archiva/conf/
  • 服务端口:8080(HTTP)
  • 元数据库:内嵌 Derby,数据目录 /opt/archiva/data/databases
  • 仓库存储:/opt/archiva/repositories/(internal、snapshots 内置 + 自建 thirdparty)
  • 管理账号:admin / q1w2e3r4

二、前置条件

  • 已按《Apache Archiva 2.2.10 安装指南》完成安装并可正常启动。
  • 配置修改后需重启服务生效:systemctl restart archiva,用 systemctl is-active archiva 确认回到 active。

三、参数查看与修改方式

Archiva 的行为由 conf/ 下三类主配置控制,改前先看清各自的加载机制:

文件作用加载方式
wrapper.confJVM 参数与 wrapper 行为:classpath、堆、附加系统属性、日志滚动bin/archiva 脚本按行读入,拼装为 java/wrapper 启动参数
jetty.xml内嵌 Jetty 连接器:监听主机/端口、空闲超时等作为启动参数传给 org.eclipse.jetty.start.Main
archiva.xml应用配置:仓库扫描文件类型、URL 失败缓存、仓库定义持久化Archiva 应用启动与运行时读写(REST/控制台改动会写回此文件)
shared.xml公共配置占位出厂为空 <configuration />
archiva-cassandra.propertiesCassandra 会话工厂参数仅当会话工厂切到 cassandra 时使用(默认 jcr,见 5.1)

查看当前生效配置(去注释后的有效内容):

grep -vE '^\s*#|^\s*$' /opt/archiva/conf/wrapper.conf | head -12
wrapper.java.command=java
wrapper.working.dir=..
wrapper.java.mainclass=org.tanukisoftware.wrapper.WrapperSimpleApp
set.default.REPO_DIR=lib
set.default.ARCHIVA_BASE=.
wrapper.java.classpath.1=lib/wrapper.jar
wrapper.java.classpath.2=%REPO_DIR%/archiva-jetty-2.2.10.pom
wrapper.java.classpath.3=%REPO_DIR%/jetty-server-8.1.14.v20131031.jar
wrapper.java.classpath.4=%REPO_DIR%/javax.servlet-3.0.0.v201112011016.jar
wrapper.java.classpath.5=%REPO_DIR%/jetty-continuation-8.1.14.v20131031.jar
wrapper.java.classpath.6=%REPO_DIR%/jetty-http-8.1.14.v20131031.jar
wrapper.java.classpath.7=%REPO_DIR%/jetty-io-8.1.14.v20131031.jar

修改流程统一为:编辑文件 → systemctl restart archiva → 用验证命令复核(每类参数的验证命令见对应小节)。示例(改端口后核对监听,见 5.1):

systemctl restart archiva && sleep 15
netstat -tlnp | grep 9080
tcp6       0      0 :::9080                 :::*                    LISTEN      27278/java

四、参数总览

参数默认值(出厂)说明
wrapper.java.initmemory512JVM 初始堆,拼为 -Xms{n}m(本文 256)
wrapper.java.maxmemory512JVM 最大堆,拼为 -Xmx{n}m
wrapper.java.additional.8-XX:MaxPermSize=128m永久代上限(JDK 8)
wrapper.java.additional.1-Dappserver.home=.安装根目录
wrapper.java.additional.6-Darchiva.repositorySessionFactory.id=jcr仓库会话工厂:jcr(默认)/ cassandra
jetty.port(系统属性)未设置时默认 8080HTTP 监听端口
jetty.host(系统属性)未设置时绑定全部网卡监听地址
仓库调度 cronExpressioninternal/snapshots:0 0 * * * ?、0 0,30 * * * ?仓库扫描周期
仓库清理 daysOlder / retentionCount30 / 2快照保留天数与版本数
远程仓库 timeout60连接/读取超时(秒)
远程仓库 cronExpression0 0 08 ? * SUN远程索引/代理更新周期
archivaRuntimeConfiguration.urlFailureCacheConfiguration2700/1800/1000 秒/秒/条远程 URL 失败缓存(避免反复撞坏源)

关键解读:日常运维最常改的是「JVM 堆、监听端口、仓库调度与清理策略」三类;archiva.xml 里的仓库定义建议经 REST 或控制台修改,手改易与运行时写回冲突。

五、核心参数分类详解

5.1 JVM 与 wrapper 参数(wrapper.conf)

wrapper.java.command=java
wrapper.working.dir=..
wrapper.java.mainclass=org.tanukisoftware.wrapper.WrapperSimpleApp
wrapper.java.additional.1=-Dappserver.home=.
wrapper.java.additional.2=-Dappserver.base=%ARCHIVA_BASE%
wrapper.java.additional.3=-Djetty.logs=%ARCHIVA_BASE%/logs
wrapper.java.additional.4=-Djava.io.tmpdir=%ARCHIVA_BASE%/temp
wrapper.java.additional.5=-DAsyncLoggerConfig.WaitStrategy=Block
wrapper.java.additional.6=-Darchiva.repositorySessionFactory.id=jcr
wrapper.java.additional.7=-Darchiva.cassandra.configuration.file=%ARCHIVA_BASE%/conf/archiva-cassandra.properties
wrapper.java.additional.8=-XX:MaxPermSize=128m
wrapper.java.initmemory=256
wrapper.java.maxmemory=512
wrapper.app.parameter.1=org.eclipse.jetty.start.Main
wrapper.app.parameter.2=%ARCHIVA_BASE%/conf/jetty.xml
wrapper.restart.delay=30
wrapper.on_exit.0=SHUTDOWN
wrapper.on_exit.default=RESTART
wrapper.logfile=%ARCHIVA_BASE%/logs/wrapper-YYYYMMDD.log
wrapper.logfile.rollmode=DATE
参数默认值说明
wrapper.java.commandjava从 PATH 找 java;固定版本可写绝对路径(如 /usr/lib/jvm/java-8-openjdk-amd64/bin/java)
wrapper.java.mainclassWrapperSimpleApp以普通应用方式拉起 Jetty,wrapper 负责守护
additional.1/2appserver.home / appserver.base = .安装根,Derby、jcr、日志等都以此为基准
additional.6repositorySessionFactory.id=jcr内容仓储会话工厂;切 cassandra 才需要 additional.7 的配置文件
additional.8MaxPermSize=128mJDK 8 永久代上限;类多时(大量代理索引)可上调
initmemory / maxmemory512 / 512本文 256 / 512;wrapper 拼为 -Xms256m -Xmx512m
app.parameter.1/2jetty.start.Main + jetty.xmlJetty 入口与配置文件
restart.delay30异常退出后 wrapper 等待 30 秒再拉起
on_exit.0 / on_exit.defaultSHUTDOWN / RESTART正常退出(如 stop)不再拉起;其他退出码自动重启
logfile.rollmodeDATEwrapper 日志按日期滚动(wrapper-YYYYMMDD.log)

出厂堆为 512/512,小规格服务器将初始堆降到 256:

sed -i 's/^wrapper.java.initmemory=512/wrapper.java.initmemory=256/' /opt/archiva/conf/wrapper.conf

重启后用 jps -v 验证实际生效值(实测):

systemctl restart archiva && sleep 15
jps -v | grep WrapperSimpleApp | grep -oE '\-Xms[0-9]+m \-Xmx[0-9]+m'
-Xms256m -Xmx512m

监听端口覆盖:Jetty 连接器从系统属性 jetty.port 读端口(见 5.2),wrapper 追加一行 JVM 参数即可覆盖(实测 8080 → 9080):

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
grep -E 'additional\.(8|9)' /opt/archiva/conf/wrapper.conf
wrapper.java.additional.8=-XX:MaxPermSize=128m
wrapper.java.additional.9=-Djetty.port=9080
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

改回时删除 additional.9 行并重启。

5.2 Jetty 连接器参数(jetty.xml)

<Call name="addConnector">
  <Arg>
      <New class="org.eclipse.jetty.server.nio.SelectChannelConnector">
        <Set name="host"><SystemProperty name="jetty.host"/></Set>
        <Set name="port"><SystemProperty name="jetty.port" default="8080"/></Set>
        <Set name="maxIdleTime">30000</Set>
        <Set name="Acceptors">2</Set>
        <Set name="statsOn">false</Set>
        <Set name="confidentialPort">8443</Set>
        <Set name="lowResourcesConnections">5000</Set>
        <Set name="lowResourcesMaxIdleTime">5000</Set>
      </New>
  </Arg>
</Call>
参数默认值说明
hostjetty.host 未设置 → 绑定全部网卡只允许本机访问可加 -Djetty.host=127.0.0.1
portjetty.port 未设置 → 8080覆盖方式见 5.1
maxIdleTime30000连接空闲 30 秒断开;大文件慢速代理客户端可上调
Acceptors2接收线程数
confidentialPort8443声明的机密端口(配合 TLS 才有意义,出厂未配 TLS)
lowResourcesConnections5000资源紧张阈值,超过后空闲时间改用 lowResourcesMaxIdleTime

💡 要出 HTTPS 需自配 TLS 连接器(Jetty 8 语法);仅内网使用时常见做法是前置 Nginx 做 TLS 终结,Archiva 保持 8080。

5.3 应用与仓库持久化(archiva.xml)

conf/archiva.xml 出厂包含三部分,且运行期的仓库管理操作会写回此文件:

(1)仓库扫描文件类型(repositoryScanning/fileTypes),决定扫描与索引哪些制品:

fileType出厂 patterns(节选)用途
artifacts**/*.pom、**/*.jar、**/*.war、**/*.ear、**/*.zip、**/*.tar.gz 等 13 种计入制品清单与统计
indexable-content**/*.txt、**/*.xml、**/*.xsd、**/*.tld 等纳入全文索引
auto-remove**/*.bak、**/*.sha1(临时产物类)扫描时自动清理

(2)运行时配置(archivaRuntimeConfiguration,出厂原样):

<archivaRuntimeConfiguration>
<fileLockConfiguration>
<skipLocking>true</skipLocking>
</fileLockConfiguration>
<urlFailureCacheConfiguration>
<timeToIdleSeconds>2700</timeToIdleSeconds>
<timeToLiveSeconds>1800</timeToLiveSeconds>
<maxElementsInMemory>1000</maxElementsInMemory>
<maxElementsOnDisk>0</maxElementsOnDisk>
</urlFailureCacheConfiguration>
</archivaRuntimeConfiguration>
参数出厂值说明
fileLockConfiguration.skipLockingtrue跳过仓库文件锁(单实例部署保持默认即可)
urlFailureCacheConfiguration.*2700 / 1800 / 1000远程源连接失败后的负面缓存:45 分钟不活跃过期、30 分钟存活、内存最多 1000 条;期间代理请求直接失败返回,避免反复等超时

(3)仓库定义持久化(managedRepositories / remoteRepositories / proxyConnectors 等段):经 REST 或控制台创建的仓库、远程仓库与代理连接规则都会落到这里。实测创建阿里云远程仓库后,该文件出现对应 <url>https://maven.aliyun.com/repository/public</url> 节点。

5.4 本地仓库参数(managed repositories)

内置两个本地仓库(首启自动创建,落盘 /opt/archiva/repositories/):

仓库出厂 locationreleasessnapshotsblockRedeploymentscronExpression
internal/opt/archiva/repositories/internaltruefalsetrue0 0 * * * ?(整点扫描)
snapshots/opt/archiva/repositories/snapshotsfalsetruefalse0 0,30 * * * ?(半点扫描)

自建本地仓库的完整参数(经 REST addManagedRepository 创建,实测 payload 与回显):

curl -s -b /tmp/archiva-cookie.txt -X POST -H 'Origin: http://localhost:8080' \
  -H 'Content-Type: application/json' -H "X-XSRF-TOKEN: $TOKEN" \
  -d '{"id":"thirdparty","name":"Third Party Repository","layout":"default","location":"/opt/archiva/repositories/thirdparty","cronExpression":"0 0 * * * ?","daysOlder":30,"retentionCount":2,"releases":true,"snapshots":false,"indexed":true,"description":"Local third-party releases","stageRepoNeeded":false,"blockRedeployments":true,"scanned":true,"skipPackedIndexCreation":false}' \
  http://localhost:8080/restServices/archivaServices/managedRepositoriesService/addManagedRepository
{"id":"thirdparty",...,"location":"/opt/archiva/repositories/thirdparty",...}
参数本文取值说明
location/opt/archiva/repositories/thirdparty必须绝对路径;写 ./repositories/thirdparty 会落成 .../repositories/repositories/thirdparty(实测怪癖)
releases / snapshotstrue / false承载 release 版还是 snapshot 版
blockRedeploymentstrue禁止同版本重复部署(release 仓库强烈建议开)
cronExpression0 0 * * * ?Quartz 6 段式:秒 分 时 日 月 周;整点扫描一次
daysOlder / retentionCount30 / 2快照清理:删 30 天前的、每版本至少留 2 个
scannedtrue参与定期扫描
indexedtrue建索引(搜索与依赖净化需要)
stageRepoNeededfalse是否建配套 staging 仓库

删除仓库(GET + 查询参数,deleteContent=true 连同落盘内容):

curl -s -b /tmp/archiva-cookie.txt -H "X-XSRF-TOKEN: $TOKEN" \
  'http://localhost:8080/restServices/archivaServices/managedRepositoriesService/deleteManagedRepository?repositoryId=thirdparty&deleteContent=true'
true

5.5 远程仓库与代理参数(remote repositories)

内置远程仓库 central(出厂原样):

参数出厂值说明
urlhttps://repo.maven.apache.org/maven2Maven 中央仓库
timeout60连接与读取超时(秒)
checkPath空连通性探测的相对路径(见下)
cronExpression0 0 08 ? * SUN每周日 08:00 更新远程索引
downloadRemoteIndexfalse出厂不自动下载远程索引

内网代理常用的是指向国内镜像(实测新增阿里云镜像并验证连通性):

curl -s -b /tmp/archiva-cookie.txt -X POST -H 'Origin: http://localhost:8080' \
  -H 'Content-Type: application/json' -H "X-XSRF-TOKEN: $TOKEN" \
  -d '{"id":"aliyun","name":"Aliyun Maven Mirror","url":"https://maven.aliyun.com/repository/public","layout":"default","timeout":60,"checkPath":"junit/junit/4.13.2/junit-4.13.2.pom","cronExpression":"0 0 08 ? * SUN"}' \
  http://localhost:8080/restServices/archivaServices/remoteRepositoriesService/addRemoteRepository
true

连通性检查接口 checkRemoteConnectivity 的行为实测:checkPath 为空时探测根路径(镜像站根路径通常 404 → 返回 false);把 checkPath 指向一个真实存在的制品路径后返回 true:

curl -s -m 15 -o /dev/null -w '%{http_code}\n' \
  https://maven.aliyun.com/repository/public/junit/junit/4.13.2/junit-4.13.2.pom
curl -s -b /tmp/archiva-cookie.txt -H "X-XSRF-TOKEN: $TOKEN" -H 'Origin: http://localhost:8080' \
  http://localhost:8080/restServices/archivaServices/remoteRepositoriesService/checkRemoteConnectivity/aliyun
200
true

代理关系经 proxy connectors 配置(控制台或 REST),配置后本地仓库即自动从远程仓库按需拉取:实测从 internal 代理取到的制品可直连下载:

curl -s -o /dev/null -w '%{http_code}\n' \
  http://localhost:8080/repository/internal/junit/junit/4.13.2/junit-4.13.2.pom
200

5.6 数据目录与日志

目录/文件用途
/opt/archiva/data/databasesDerby 元数据库(仓库定义、用户、审计等)
/opt/archiva/data/jcr内容仓储(jcr 会话工厂的索引与元数据)
/opt/archiva/data/remotes远程仓库下载缓存
/opt/archiva/data/users用户数据库
/opt/archiva/repositories/仓库存储(制品按 Maven 布局落盘)
/opt/archiva/derby.logDerby 引擎日志(在安装根)
logs/archiva.log应用主日志
logs/wrapper-YYYYMMDD.logwrapper 与 JVM 启动日志(含 Full thread dump,bin/archiva dump 输出落此)
logs/request-YYYYMMDD.logHTTP 请求日志
logs/archiva-audit.log仓库审计事件(部署、删除、代理下载)

备份要点:停服后打包 data/ 与 repositories/ 即为完整备份;logs/ 可按需归档。

5.7 systemd 部署参数

/etc/systemd/system/archiva.service(完整文件见《安装指南》4.7):

配置项本文取值说明
Typeforkingwrapper start 拉起后台进程
PIDFile/opt/archiva/logs/archiva.pid与 wrapper 脚本内 PIDDIR 一致
LimitNOFILE65536仓库文件数大时防 too many open files
TimeoutStartSec180首次启动含 Derby 建库,放宽超时
Restart / RestartSecon-failure / 30与 wrapper 的 restart.delay=30 语义对应

六、生产配置模板

适用场景:4 核 8GB 内存、单实例、承担团队内部 Maven 代理与私有制品托管、仓库存储独立挂盘到 /data/archiva-repos。

conf/wrapper.conf 关键行(相对出厂的改动):

wrapper.java.command=/usr/lib/jvm/java-8-openjdk-amd64/bin/java
wrapper.java.additional.8=-XX:MaxPermSize=256m
wrapper.java.additional.9=-Djetty.port=8081
wrapper.java.initmemory=512
wrapper.java.maxmemory=2048
wrapper.restart.delay=30

conf/jetty.xml 建议仅调 maxIdleTime(代理大文件的慢客户端):

<Set name="maxIdleTime">60000</Set>

仓库策略建议(经控制台/REST 配置):

项建议值理由
release 仓库 blockRedeploymentstrue防止同版本制品被覆盖
snapshot 仓库 daysOlder/retentionCount7 / 1快照膨胀快,收紧保留策略
远程仓库 timeout120弱网环境减少代理失败
远程索引 downloadRemoteIndexfalse远程索引体积大,按需检索即可

systemd 单元与《安装指南》4.7 相同;堆 2048MB 时整机内存建议 4GB 起。

说明:256-512MB 小堆(-Xms256m -Xmx512m)已实测可稳定启动并完成管理员初始化、建仓、代理拉取全流程(systemd Memory 字段实测 428.7M);上表加大堆面向数百 G 制品库规模,上线后按 archiva.log 扫描耗时与 wrapper 日志 GC 表现微调。

七、常见问题

7.1 修改配置后不生效

现象:改了 wrapper.conf 或 jetty.xml,行为仍是旧值。

定位:只在启动时读配置,运行中不会热加载;systemd 场景还需确认改的是 /opt/archiva/conf/ 下的真实文件(多实例部署易改错目录)。

解决:重启并复核:

systemctl restart archiva && sleep 15
systemctl is-active archiva
jps -v | grep WrapperSimpleApp | grep -oE '\-Xms[0-9]+m \-Xmx[0-9]+m'
active
-Xms256m -Xmx512m

7.2 端口被占用启动失败

现象:wrapper 日志出现 Address already in use,服务反复重启(wrapper on_exit.default=RESTART)。

定位与解决:netstat -tlnp | grep 8080 找到占用进程停掉,或按 5.1 换端口(-Djetty.port)后重启。注意 wrapper 会自动重试拉起,先修配置再观察,不要在端口冲突时反复手动 start 制造多实例。

7.3 堆内存不足(OutOfMemoryError)

现象:logs/wrapper-YYYYMMDD.log 出现 java.lang.OutOfMemoryError;JDK 8 下有两类——堆不足(Java heap space)与永久代不足(PermGen space)。

解决:堆不足上调 maxmemory;PermGen 不足上调 additional.8 的 -XX:MaxPermSize。改完重启并用 jps -v 确认。512MB 堆 + 128MB 永久代实测可支撑中小规模仓库;大量代理索引时优先加永久代。

7.4 代理源连不上但镜像站可达

现象:checkRemoteConnectivity 返回 false,但同路径 curl 返回 200。

定位:checkPath 为空时探测的是远程仓库根路径,很多镜像站根路径返回 404,被判定为不可达(实测阿里云镜像即如此)。

解决:给远程仓库配置 checkPath 指向一个确定存在的制品(如 junit/junit/4.13.2/junit-4.13.2.pom),再检查即返回 true(见 5.5 实测)。

7.5 仓库落盘位置不对(多一层 repositories)

现象:建仓 location 写 ./repositories/thirdparty,实际生成 /opt/archiva/repositories/repositories/thirdparty。

定位与解决:相对路径按 repositories 根拼接且不归一化(实测怪癖),建仓一律写绝对路径;已建错的删仓重建即可。

7.6 REST 改的仓库定义和 archiva.xml 不一致

定位:仓库/远程仓库/代理连接的定义以 Archiva 运行时数据库(Derby)为准,archiva.xml 是启动持久化与写回文件;直接手改该文件不等于改运行时配置。

解决:一律经控制台或 REST 修改仓库定义;手改仅适用于 fileTypes、urlFailureCacheConfiguration 等静态段,改完重启。

八、参考链接