DSpace 配置参数详解(env/local.cfg/dspace.cfg 三层优先级链与关键项)
DSpace 配置参数详解:以 10.1 实测安装为样本,三态实验固化 env>local.cfg>dspace.cfg 优先级链,覆盖 __P__/__D__ 变量注入拼写、${} 变量插值级联、5 秒热重载端到端实测、14 项关键参数默认值与生效值对照、include 模块化机制与改配置生效方式速查。
DSpace 配置参数详解(env/local.cfg/dspace.cfg 三层优先级链与关键项)
目标:以 2026-11-01 实测的 DSpace 10.1 安装(安装目录
/dspace,部署过程见《DSpace 10.1 Docker Compose 部署指南》)为样本,讲清 DSpace 配置体系的加载顺序与优先级链(环境变量 > local.cfg > dspace.cfg)、变量注入拼写、变量插值、5 秒热重载与关键参数,全部结论均有命令实录支撑。产品背景见《DSpace 介绍与选型指南》。
一、环境信息与配置体系总览
| 项目 | 内容 |
|---|---|
| 实测日期 | 2026-11-01 |
| 版本 | DSpace 10.1(REST API 后端) |
| 安装目录 | /dspace(dspace dsprop -p dspace.dir 实测回显 /dspace) |
| 配置目录 | /dspace/config |
| 定义文件 | config-definition.xml(51 行,决定加载顺序) |
| 主配置 | dspace.cfg(2072 行,经 include 拉入 53 个模块配置) |
| 覆写层 | local.cfg(可选,出厂不存在——实测 wc: /dspace/config/local.cfg: No such file or directory) |
| 环境变量层 | 编排/运行环境注入的 dspace__P__* 等变量(见第三节) |
| 核验工具 | /dspace/bin/dspace dsprop -p <key>(读最终解析值)、REST 根资源回显 |
/dspace/config 目录实测清单(节选):
ant.properties
config-definition.xml
controlled-vocabularies
crosswalks
default.context.xml
default.license
dspace.cfg
dspace.cfg.default
dstat.cfg
dstat.map
ehcache.xml
emails
entities
hibernate-ehcache-config.xml
hibernate.cfg.xml
item-submission.dtd
item-submission.xml
launcher.xml
ldn
...
DSpace 配置体系一句话总览:一个定义文件(config-definition.xml)规定加载顺序,一个主配置(dspace.cfg)通过 include 聚合模块配置,一个可选覆写(local.cfg)承接本地定制,环境变量层压顶——四层叠加后由 Commons Configuration 合成单一视图,应用与 CLI 读到的都是合成结果。
二、加载顺序与优先级链(源码 + 三态实测)
2.1 定义文件原文
config-definition.xml 的 override 段决定优先级,注释原文即规则本身:
<!-- Configurations in this section override one another.
Earlier values take precedence, and override any values in later config files -->
<override>
<!-- Load Java System properties (does not automatically reload) -->
<system/>
<!-- Load Environment variables (does not automatically reload) -->
<env/>
<!-- Load Environment variables that contain two underlines in their names. ... -->
<dspaceenv/>
<!-- Allow user to override any configs in a local.cfg -->
<properties fileName="local.cfg" throwExceptionOnMissing="false" config-name="local" config-optional="true"
encoding="UTF-8" config-reload="true" reloadingRefreshDelay="5000"/>
<!-- Load our dspace.cfg (which in turn loads all module configs via "include=" statements) -->
<properties fileName="dspace.cfg" throwExceptionOnMissing="true" encoding="UTF-8" config-reload="true"
reloadingRefreshDelay="5000"/>
</override>
即最终优先级链:JVM 系统属性 > 环境变量 > local.cfg > dspace.cfg(含全部 include 的模块配置)。
2.2 三态实测(同一参数 dspace.name)
| 实验态 | 操作 | API 根资源 dspaceName 实测回显 | 结论 |
|---|---|---|---|
| 态 1 | 环境变量 dspace__P__name=DSpace 10.1 (quzuo demo) 与 local.cfg dspace.name = DSpace via local.cfg 同时存在,重启生效 | DSpace 10.1 (quzuo demo) | env 压过 local.cfg |
| 态 2 | 移除该环境变量并重建运行实例(local.cfg 随可写层丢失) | DSpace at My University | 回落 dspace.cfg 出厂值 |
| 态 3 | 重新写入 local.cfg 并重启(不重建实例) | DSpace via local.cfg | local.cfg 压过 dspace.cfg |
三态闭环验证了 2.1 的链序。dsprop 读到的最终值与 API 回显一致:
$ /dspace/bin/dspace dsprop -p dspace.name
DSpace via local.cfg
三、环境变量注入拼写(__P__ / __D__)
配置项名里大量出现点号与短横线(dspace.server.url、oai.enabled),而 shell 变量名不允许这些字符。DSpace 为此提供专用 dspaceenv provider,定义文件注释原文:
This provider translates "__P__" to periods and "__D__" to dashes in environment variables.
本部署实测环境变量清单(后端进程 env 节选)与还原映射:
| 注入变量名 | 还原为配置项 | 实测值 |
|---|---|---|
dspace__P__dir | dspace.dir | /dspace |
dspace__P__server__P__url | dspace.server.url | http://192.168.1.200:8139/server |
dspace__P__ui__P__url | dspace.ui.url | http://192.168.1.200:8139 |
dspace__P__server__P__ssr__P__url | dspace.server.ssr.url | http://dspace-10.1-backend:8080/server |
db__P__url | db.url | jdbc:postgresql://dspace-10.1-db:5432/dspace |
solr__P__server | solr.server | http://dspace-10.1-solr:8983/solr |
proxies__P__trusted__P__ipranges | proxies.trusted.ipranges | 10.89.58 |
注意 db__P__url、solr__P__server 这类不带 dspace 前缀的键同样适用该拼写;标准 Java 系统属性(-Ddb.url=...)走 <system/> 层,优先级更高。
四、变量插值与派生配置
dspace.cfg 与模块配置大量使用 ${key} 插值,合成视图解析后上游覆写会级联传导。实测链条:oai.cfg 原文
oai.url = ${dspace.server.url}/${oai.path}
oai.path = oai
dspace.server.url 被环境变量覆写后,派生值同步改变:
$ /dspace/bin/dspace dsprop -p oai.url
http://192.168.1.200:8139/server/oai
端点可达性实测:GET /server/oai?verb=Identify 返回 HTTP 302,Location: http://127.0.0.1:8139/server/oai/,跟随后输出 OAI 索引页(模板注释原文 "DSpace OAI default index template")。同理:
$ /dspace/bin/dspace dsprop -p assetstore.dir
/dspace/assetstore
对应 assetstore.cfg 原文 assetstore.dir = ${dspace.dir}/assetstore。
💡 排查提示:改了
dspace.server.url却发现 OAI/SWORD/邮件链接等"跟着变"或"该变没变",先dsprop读派生项最终值,确认是插值传导还是该模块写死了字面量。
五、5 秒热重载实测
定义文件中 local.cfg 与 dspace.cfg 均声明 config-reload="true" reloadingRefreshDelay="5000"——配置读取层每 5 秒重扫文件。端到端实测(改 local.cfg、不重启任何进程):
### 改前 API 回显
DSpace via local.cfg
### 写入 local.cfg: dspace.name = DSpace hot-reload test,等待 8 秒
### 改后 API 回显(无重启)
DSpace hot-reload test
### 恢复 local.cfg 原值,等待 8 秒
DSpace via local.cfg
热重载边界(实践守则):dsprop/API 回显这类每次读取动态取值的参数即时生效;而数据库连接、Solr 客户端、Spring Bean 初始化时固化的参数(如 db.url、solr.server)改完仍需重启进程。判断标准:看该值是在"用时读取"还是"启动注入"。
六、关键参数详解(出厂默认 vs 本部署实测)
| 参数 | dspace.cfg 出厂实测默认 | 本部署生效值(实测来源) | 作用 |
|---|---|---|---|
| dspace.dir | /dspace | /dspace | 安装根,一切相对路径基座 |
| dspace.name | DSpace at My University | DSpace via local.cfg(API 根回显) | 站点名,UI 标题/邮件署名 |
| dspace.server.url | http://localhost:8080/server | http://192.168.1.200:8139/server(env) | REST 对外基址,HAL 链接生成根 |
| dspace.ui.url | http://localhost:4000 | http://192.168.1.200:8139(env) | UI 对外基址,Handle/邮件回链 |
| db.url | jdbc:postgresql://localhost:5432/dspace | jdbc:postgresql://dspace-10.1-db:5432/dspace(env,迁移日志实录) | 数据库连接 |
| db.username | dspace | dspace | 数据库账号 |
| solr.server | http://localhost:8983/solr | http://dspace-10.1-solr:8983/solr(env,dsprop 实测) | Solr 基址,7 个 core 挂其下 |
| handle.prefix | 123456789 | 123456789(dsprop 实测;建社区返回 handle 123456789/7 印证) | 持久标识前缀,接入全局 Handle 网络时改为注册前缀 |
| proxies.trusted.ipranges | (注释示例) | 10.89.58(env) | 信任的反代网段,X-Forwarded-For 采信依据 |
| authentication-password.regex-validation.pattern | ^.{8\,}$ | 同左(modules 实测) | 口令强度:最少 8 字符(示例口令 q1w2e3r4 恰好 8 位) |
| oai.enabled / oai.storage | true / solr | 同左(modules 实测) | OAI-PMH 开关与存储 |
| assetstore.dir | ${dspace.dir}/assetstore | /dspace/assetstore(dsprop) | 比特流主存储;assetstore.s3.enabled = false,开 S3 兼容存储时改此组 |
| mail.server / mail.server.port | smtp.example.com / 25 | 同左(出厂默认) | 邮件网关,生产必改,否则工作流通知全部失败 |
三点展开:
- 站点标识三件套联动:
dspace.server.url/dspace.ui.url决定 API 根资源回显与全部 HAL_links、Handle 解析页地址(实测dc.identifier.uri生成为http://192.168.1.200:8139/handle/123456789/1)——改入口不改这两项,对外链接全部指向旧地址。 - 口令策略在模块层:密码长度校验不在 dspace.cfg 而在
modules/authentication-password.cfg,local.cfg 直接写authentication-password.regex-validation.pattern = ...即可覆写(键名无层级限制,见第七节)。 - 出厂默认值即排障线索:
db.url/solr.server默认 localhost 只适用于单机同机部署;多组件分离部署必须覆写(部署篇第十节问题 4)。
七、dspace.cfg 的 include 机制与 modules 目录
dspace.cfg(2072 行)尾部实测 53 行 include 声明(行号 2020–2072),形如:
include = ${module_dir}/actuator.cfg
include = ${module_dir}/altcha.cfg
...
include = ${module_dir}/authentication.cfg
include = ${module_dir}/authentication-password.cfg
...
include = ${module_dir}/oai.cfg
...
include = ${module_dir}/workflow.cfg
include = ${module_dir}/audit.cfg
${module_dir} 即 dspace.dir 下的 config/modules,实测目录与 include 一一对应(节选):
actuator.cfg
altcha.cfg
altmetrics.cfg
assetstore.cfg
audit.cfg
authentication-ip.cfg
authentication-ldap.cfg
authentication-oidc.cfg
authentication-password.cfg
authentication-saml.cfg
authentication-shibboleth.cfg
authentication.cfg
authority.cfg
bulkedit.cfg
...
模块化的实际意义:功能开关集中在模块 cfg(如 LDAP/OIDC/SAML 认证、S3 资产存储、OAI、IIIF、统计),定制时把对应 cfg 的关键项抄进 local.cfg 覆写,不动 dspace.cfg 本体,升级无痛。
八、改配置生效方式速查
| 改动位置 | 生效方式 | 实测依据 |
|---|---|---|
环境变量(dspace__P__* 等) | 需重启进程;实例重建时注意可写层丢失 | 第二节态 1/态 2 |
| local.cfg | 5 秒热重载(动态读取类);连接类参数重启后生效 | 第五节实测 |
| dspace.cfg | 同为 5 秒热重载,但不建议直接改(升级覆盖风险),一律抄到 local.cfg | 定义文件 reload 声明 |
| modules/*.cfg | 同上,覆写进 local.cfg | 第七节 |
系统属性 -Dkey=value | 启动参数,重启生效,优先级最高 | 定义文件 <system/> |
九、常见问题
- "配置改过又变回去了":改动落在可写层(直接编辑实例内文件)而非持久卷,重建即丢。实测:态 2 重建后
dspaceName回落出厂值。解法:local.cfg 用挂载卷固化,或干脆全部走环境变量。 - 想经 API 读配置值,全部 404:
GET /server/api/config/properties/dspace.name、.../authentication.password.enabled、.../dspace.environment实测均HTTP 404({"status":404,...,"path":"/server/api/config/properties/dspace.name"})。10.1 该端点不暴露常规配置项;读最终值用dspace dsprop -p <key>(本文通篇用法)。 - 改了 dspace.server.url,OAI 链接没变/变了:插值级联所致,用
dsprop -p oai.url验证派生链(第四节方法)。 - local.cfg 里写
dspace.dir不生效:安装根在启动早期固化,属"启动注入"类参数,热重载救不了——放环境变量或系统属性层。 - 优先级判断没把握时:复制第二节三态实验法——同一参数在 env/local.cfg/dspace.cfg 各写不同值,
dsprop读一次即知谁赢。
十、参考链接
- 站内:《DSpace 介绍与选型指南》
- 站内:《DSpace 10.1 Docker Compose 部署指南》
- 站内同类配置篇对照:《EPrints 配置参数详解(cfg.d 分层体系与关键项)》
- DSpace 官方文档 DSDOC10x(Configuration 章节,查询日期 2026-11-01):https://wiki.lyrasis.org/display/DSDOC10x
- Apache Commons Configuration CombinedBuilder(config-definition.xml 注释原文引用的规范,查询日期 2026-11-01):https://commons.apache.org/proper/commons-configuration/userguide/howto_combinedbuilder.html