Ubuntu 22.04 安装部署 Apache Marmotta 指南
在 Ubuntu 22.04 上从零安装部署 Apache Marmotta 3.4.0 的完整实录,涵盖依赖安装、发行包下载校验、war 包部署进 Tomcat 9、家目录与堆内存配置、三处典型兼容报错的排障过程与卸载方式。
Ubuntu 22.04 安装部署 Apache Marmotta 指南
一、部署方案与版本选择
Apache Marmotta 的最后一个版本是 3.4.0(项目已于 2020 年 11 月退役、2021 年 4 月进入 Attic),部署方式有两种:使用官方 installer 图形/命令行安装器,或直接把发行包中的 marmotta.war 部署进已有 Web 运行环境。生产与运维场景推荐第二种:war 部署路径清晰、启动停止归口于系统服务管理、数据目录可通过 Context 参数显式指定。本文按 war 部署路线在 Ubuntu 22.04 上完成从零到可用的全过程,运行环境选用软件源中的 Tomcat 9,Java 选用 OpenJDK 8。
版本组合有三个实测依据。其一,Marmotta 3.4.0 按 Java 8 时代构建,部署在 JDK 8 上启动正常;改用系统默认的更高版本 Java 时,首页会直接抛出 java.lang.ClassCastException: java.base/jdk.internal.reflect.ObjectStreamClass$Caches$1 cannot be cast to java.io.ObjectStreamClass$Caches$1 一类的序列化缓存异常,因此第一步就要把 Java 固定为 8。其二,Tomcat 9 与 3.4.0 兼容良好,实测部署后响应头返回 Server: Apache Marmotta/3.4.0 (build 0),SPARQL 与 LDP 全部端点可用。其三,Ubuntu 22.04 源内 Tomcat 9 自带的 JSP 编译器版本过新,与 Marmotta 内置 JSP 页面存在字节码版本冲突,需要按第七节替换为旧版编译器,这是整个部署中最隐蔽的一步。
二、系统准备
开始前建议先跑一组预检,确认资源与端口条件。实测环境的检查命令与结果:
df -h /opt | tail -1
free -m | sed -n 2p
(curl -s -o /dev/null -m 2 http://localhost:8080/ && echo "8080 已被占用") || echo "8080 可用"
实测回显:
overlay 786G 488G 264G 65% /
Mem: 32050 19892 1414 29 10743 11593
8080 已被占用
第三条在本环境返回"已被占用"是正常的——这台服务器上 Tomcat 已按后续章节完成部署并常驻运行;在全新机器上应显示 8080 可用,否则要先按第九节处理端口冲突。资源口径:webapp 包 41MB 加 war 展开后的 193 个文件(实测解压总量约 41MB,四百余万行以内的代码与资源量级),家目录初始十几 KB、随数据增长(实测持续写入后 db 文件从 282,624 字节增长到 401,408 字节),磁盘 1GB 余量即可;内存按第五节堆参数 256 到 512MB 评估,加上 Tomcat 运行环境自身开销,1GB 内存可跑评估负载,数据量上万三元组后建议 2GB 起步。
以具备 sudo 权限的普通用户或 root 执行以下步骤。首先更新软件源并安装基础组件:
sudo apt-get update
sudo apt-get install -y openjdk-8-jdk tomcat9 curl unzip
安装完成后确认 Java 路径与版本:
ls /usr/lib/jvm/
update-alternatives --list java
java -version
实测输出:
java-1.8.0-openjdk-amd64 java-8-openjdk-amd64
/usr/lib/jvm/java-8-openjdk-amd64/bin/java
openjdk version "1.8.0_504" ...
由于系统内可能同时装有多个 Java 版本且默认指向高版本,需要把默认 Java 显式切到 8:
sudo update-alternatives --set java /usr/lib/jvm/java-8-openjdk-amd64/bin/java
sudo update-alternatives --set javac /usr/lib/jvm/java-8-openjdk-amd64/bin/javac
为 Marmotta 建立独立的数据家目录并规划权限。家目录是应用存放配置、数据库、日志与导入文件的根,推荐放在独立路径便于备份:
sudo mkdir -p /opt/marmotta/home
sudo chown -R tomcat:tomcat /opt/marmotta
若计划同时部署其他服务,建议把下载产物统一放到 /opt/downloads 目录管理:
sudo mkdir -p /opt/downloads
三、下载与完整性校验
Marmotta 3.4.0 的发行文件位于 Apache 分发目录的 /marmotta/3.4.0/ 路径下,包含 installer 安装包与 webapp 精简包两个压缩档。下载两个包及 installer 包对应的 SHA1 校验文件:
cd /opt/downloads
wget https://dlcdn.apache.org/marmotta/3.4.0/apache-marmotta-3.4.0-installer.tar.gz
wget https://dlcdn.apache.org/marmotta/3.4.0/apache-marmotta-3.4.0-installer.tar.gz.sha1
wget https://dlcdn.apache.org/marmotta/3.4.0/apache-marmotta-3.4.0-webapp.tar.gz
下载完成后核对文件大小:
ls -la /opt/downloads/apache-marmotta-3.4.0-*
关于校验方式有三点背景说明。其一,3.4.0 时代 Apache 发行规范的校验档以 SHA1 为主,比 Lens 归档的 SHA512 弱一档,也比 Lenya 归档的 MD5 强一档,三个项目恰好构成校验规范演进的时间切片;SHA1 理论上存在碰撞攻击,但对"下载损坏与传输截断"这一主要风险仍完全覆盖,配合官方 dlcdn 域名的 TLS 通道,实用性不受影响。其二,校验文件应在下载后立即比对(sha1sum -c 或逐串比对),并把校验文件与发行包同目录留存,日后做灾备演练时可复验。其三,dlcdn.apache.org 是现行分发服务,对已退役项目仍保留历史版本目录,这是退役项目相对其他渠道的优势——发行物与校验档始终同源可得,无需从第三方渠道拼凑证据链。
实测输出:
-rw-r--r-- 1 root root 47775588 ... apache-marmotta-3.4.0-installer.tar.gz
-rw-r--r-- 1 root root 41 ... apache-marmotta-3.4.0-installer.tar.gz.sha1
-rw-r--r-- 1 root root 37062976 ... apache-marmotta-3.4.0-webapp.tar.gz
用官方校验文件比对 installer 包摘要:
cat apache-marmotta-3.4.0-installer.tar.gz.sha1
sha1sum apache-marmotta-3.4.0-installer.tar.gz
实测官方文件内容与本地计算结果均为:
228e323c44f333db8be9d399e10558bc2117141d
再计算 webapp 包摘要留档(该包无独立校验文件,可与官网公布的发布说明交叉核对):
sha1sum apache-marmotta-3.4.0-webapp.tar.gz
实测输出:
4ceee1036532a9e6c0da800a2ec81a9adaa8ea22 apache-marmotta-3.4.0-webapp.tar.gz
四、解压并获取 war 包
解压 webapp 包,其内包含待部署的 marmotta.war:
tar -xzf apache-marmotta-3.4.0-webapp.tar.gz
ls -la apache-marmotta-3.4.0/
实测包内为 LICENSE.txt、NOTICE.txt、README.txt 与 marmotta.war,war 文件大小为 40,942,207 字节。把 war 复制进 Tomcat 的部署目录:
sudo cp apache-marmotta-3.4.0/marmotta.war /var/lib/tomcat9/webapps/
installer 包(47MB)是带安装向导的完整发行档,实测其 tar 内只有四个条目:
apache-marmotta-3.4.0/LICENSE.txt
apache-marmotta-3.4.0/README.txt
apache-marmotta-3.4.0/NOTICE.txt
apache-marmotta-3.4.0/marmotta-installer-3.4.0.jar
也就是说 installer 本体是一个可执行的 Java 安装器 jar(IzPack 风格),运行 java -jar marmotta-installer-3.4.0.jar 后按向导勾选模块与路径即可完成安装,它并不直接等同于"解压即用的 war"。仅做 war 部署时并不需要它,但建议与 webapp 包一并留存校验,作为发行完整性的双证据。两个包的功能范围也有差异:webapp 包默认勾选的是核心模块组,installer 路线可在向导里勾入更多可选模块,选型前应对目标形态做路径探测确认。
war 的内部结构也值得在部署前看一眼,实测 unzip -l 统计 marmotta.war 共 193 个文件、展开总量 41,123,736 字节,其中 WEB-INF/lib 目录装载了绝大多数内容(169 个 jar),涵盖 KiWi 存储引擎、Sesame RDF 框架与各模块实现。了解这个构成有两点用处:其一,webapps 下展开后的 marmotta 目录体积与 war 相当,磁盘评估应按展开后口径计算;其二,遇到类冲突或缺失时,确认类属于哪个 jar 是第一步,jar 清单就是组件地图。
五、配置 Tomcat:Java 版本、堆内存与家目录
先固化 Tomcat 的 Java 版本与 JVM 参数。编辑 /etc/default/tomcat9(Ubuntu 源内 Tomcat 9 的环境配置文件),写入或修改以下两行:
JAVA_HOME=/usr/lib/jvm/java-8-openjdk-amd64
JAVA_OPTS="-Djava.awt.headless=true -Xms256m -Xmx512m"
其中 JAVA_HOME 强制 Tomcat 以 JDK 8 启动,避开高版本 Java 的序列化兼容异常;堆内存按 256MB 起步、上限 512MB 设置,Marmotta 默认模块组在该堆规格下实测启动与查询正常,后续可依数据量上调 Xmx。修改后可通过进程参数确认生效(见第八节)。
再通过 Tomcat 的 Context 描述文件为应用指定数据家目录。创建 /etc/tomcat9/Catalina/localhost/marmotta.xml,内容如下:
<?xml version="1.0" encoding="UTF-8"?>
<Context>
<Parameter name="marmotta.home" value="/opt/marmotta/home" override="false"/>
</Context>
override="false" 表示应用内部若自带默认值也不会覆盖此处配置。该文件名 marmotta 与 war 名一致,Tomcat 会将其作为该应用的私有 Context 配置加载。若不显式指定家目录,Marmotta 会退回到默认位置,不利于备份与多环境迁移,因此这一步建议作为固定动作。
Context 描述文件机制再展开一点:Tomcat 允许以 $CATALINA_BASE/Catalina/localhost/<应用名>.xml 的形式给单个 webapp 传初始化参数,Marmotta 在启动早期读取名为 marmotta.home 的 ServletContext 参数并把配置与数据落盘到该路径,这就是"数据与应用分离"的实现机制。生产环境的三点推论:家目录应放在独立分区或至少独立路径上,与系统盘隔离,便于容量监控;迁移实例时只需打包该目录加 war 两样,Context 文件重建即可,路径不变化时数据无缝接管;同一台 Tomcat 部署多个 Marmotta 实例(不同 war 名与不同 Context 文件)时,务必给每个实例指定不同家目录,否则两个实例会竞争同一套 config 与 db 文件。连接器层面无需特别调整,默认 8080 端口与 HTTP/1.1 连接器即可,若前面有反向代理再考虑 server.xml 中的 proxyPort/URIEncoding 项——对 RDF URI 含查询串的场景,显式设置 URIEncoding="UTF-8" 是稳妥选择。
六、运行环境文件系统权限
Ubuntu 源内的 Tomcat 9 服务以 systemd 管理,默认启用 ProtectSystem=strict 加固策略,服务进程对大部分文件系统路径只读,而 Marmotta 首次启动需要在家目录创建 config、db 等子目录,必须为该路径显式放行。创建 systemd 附加配置目录与文件:
sudo mkdir -p /etc/systemd/system/tomcat9.service.d
cat <<'EOF' | sudo tee /etc/systemd/system/tomcat9.service.d/override.conf
[Service]
ReadWritePaths=/opt/marmotta/home
EOF
sudo systemctl daemon-reload
若跳过此步骤直接启动,应用首页会报错,日志中出现 could not create directory /opt/marmotta/home/config 字样,这是本部署方案中最常见的启动失败原因。除家目录外无需为 Tomcat 额外放行其他路径,war 本体与 Context 文件均在 Tomcat 自身可读范围内。
把 systemd 加固机制讲透,便于以后举一反三。ProtectSystem=strict 是 Ubuntu 打包者给 Tomcat 9 预设的安全沙箱:挂载命名空间层面的全盘只读,进程对文件系统的任何写动作都会被内核直接拒绝,应用看到的错误形态往往是 Permission denied 或目录创建失败,而不是普通的应用异常。ReadWritePaths 是 sandbox 范式下的"白名单洞",语义是仅对列出的路径重新挂载为可写。判断"该不该再放行别的路径"有一条原则:只放行应用的数据目录,不放行系统配置区与日志区之外的可执行区——Marmotta 正常运行只写家目录,因此一条 ReadWritePaths 就是完整答案;若日志里出现指向其它路径的写失败,先怀疑配置项把某个数据位置指到了家目录之外(如把导入文件路径配到 /tmp),此时应优先改配置把路径收回家目录,而不是扩大沙箱白名单。验证放行是否生效可用 systemctl show tomcat9 -p ReadWritePaths 查看,输出应列出 /opt/marmotta/home。
七、JSP 编译器版本兼容处理
Ubuntu 22.04 源内 Tomcat 9 依赖的 JSP 编译器包 eclipse-jdt-core 版本较新(实测为 3.27.0 系,编译产物字节码版本 55,即 Java 11),而 Marmotta 3.4.0 的管理页面 JSP 需要在 Java 8(字节码版本 52)下编译运行。部署后访问管理页面可能遇到 JSP 编译失败,日志关键字为 UnsupportedClassVersionError 或 ecj 相关的版本错误。解决办法是把编译器替换为支持 Java 8 目标的旧版本 3.13.101:
cd /opt/downloads
wget https://repo1.maven.org/maven2/org/eclipse/jdt/ecj/3.13.101/ecj-3.13.101.jar
ls -la /usr/share/java/ | grep jdt
实测系统内该库以符号链接 /usr/share/java/eclipse-jdt-core.jar 指向带版本号的实体文件。下载完成后替换链接指向:
sudo cp ecj-3.13.101.jar /usr/share/java/
sudo ln -sf ecj-3.13.101.jar /usr/share/java/eclipse-jdt-core.jar
该 jar 为 2.1MB 量级,替换后重启 Tomcat 生效。判断是否需要此步骤的方法很直接:若第八节启动验证时管理界面 500 且日志出现编译器版本相关异常,则执行本节;若一切正常可跳过。作为通用排障习惯,Marmotta 部署期的报错应始终先看 /opt/marmotta/home/log/ 与 Tomcat 日志 /var/log/tomcat9/ 两处。
字节码版本与编译器的关系值得展开,它解释了"为什么新编译器反而不行"。ecj 的版本号与其默认生成的目标字节码版本挂钩:3.27.0 系默认以 Java 11(字节码 55)为目标,产出的 JSP 类文件在 Java 8 虚拟机(最高接受字节码 52)上无法加载,JVM 抛出的就是 UnsupportedClassVersionError;而 3.13.101 是 Eclipse 平台 Photon 时代的版本,默认目标覆盖到 Java 8。Tomcat 加载 JSP 的链路是"页面修改则触发重新编译",因此即便 war 里预编译的类没问题,首次访问管理页面也会触发即时编译并踩中该问题——这就是报错集中出现在管理页面的原因。如果部署环境不允许联网下载旧版 ecj,替代方案是在有网环境下载后拷贝入内,或为 Tomcat 配置 -Dtomcat.util.scan.StandardJarScanFilter 等手段;前者简单可靠,后者治标不治本,推荐前者。
八、启动与验证
依次重启服务并检查进程参数:
sudo systemctl restart tomcat9
ps -ef | grep [j]ava
实测进程命令行中包含以下片段,证明第五节的堆配置已生效:
-Djava.awt.headless=true -Xms256m -Xmx512m
首次启动时 Marmotta 会初始化家目录结构并建库,等待约一分钟后开始验证。第一步确认 war 已解包并监听:
ls /var/lib/tomcat9/webapps/
curl -s -o /dev/null -w "%{http_code} -> %{redirect_url}\n" http://localhost:8080/marmotta/
实测输出:
ROOT marmotta marmotta.war
302 -> http://localhost:8080/marmotta/core/admin/about.html
302 重定向指向管理首页说明应用已激活。第二步访问管理首页确认页面可渲染:
curl -s -o /dev/null -w "%{http_code}\n" http://localhost:8080/marmotta/core/admin/about.html
curl -s -o /dev/null -w "%{http_code}\n" http://localhost:8080/marmotta/ldp
curl -s -o /dev/null -w "%{http_code}\n" "http://localhost:8080/marmotta/sparql/select"
实测三个状态码分别为 200、200、400——查询端点在不带 query 参数时返回 400 属于预期的参数校验行为,恰证明端点已就绪。第三步确认响应头与数据目录:
curl -sI -X POST http://localhost:8080/marmotta/ldp | grep -i server
ls /opt/marmotta/home/
实测响应头为 Server: Apache Marmotta/3.4.0 (build 0),家目录下出现 config、db、import、log、resources、templates 子目录及 system-config.properties 文件,其中记录着 kiwi.version = 3.4.0 与默认 H2 连接串。浏览器访问 http://服务器地址:8080/marmotta/ 即可看到管理控制台入口,至此部署完成。
8.1 家目录子目录详解
六个子目录加一个配置文件各有明确职责,巡检与备份策略应按职责区分对待:config 存放运行时配置(初始化时由默认模板生成,system-config.properties 中的条目可手工修改后重启生效);db 是 H2 数据库文件所在,marmotta.mv.db 与 .trace.db 两个文件承载全部三元组数据,是备份的第一优先级;import 供批量导入任务暂存文件;log 存放应用日志;resources 与 templates 存放界面静态资源与页面模板。system-config.properties 内的条目按"模块前缀加点分键"组织,如 kiwi.* 为存储引擎参数、security.restriction.* 为安全约束、package.resources.* 为资源映射,改配置时先确认前缀归属的模块再动键值。
8.2 日志文件三件套
家目录 log 子目录实测包含三个文件,分工清晰:marmotta-main.log 记录应用主事件流(模块初始化、任务执行、入库统计,是日常排障首选);marmotta-security.log 记录安全相关事件(默认约束规则装载、系统账号创建等);marmotta-debug.log 供调试期使用,默认部署下为空文件(实测 0 字节),需要细粒度排查时在配置中调高对应模块日志级别后它才开始积累。三者与 Tomcat 自身的 /var/log/tomcat9/ 日志(catalina.out 记录运行环境级错误如 ecj 字节码异常)互补:运行环境问题看 Tomcat 日志,应用问题看 marmotta-main.log,权限与账号问题看 marmotta-security.log。
8.3 数据文件增长观测与巡检
H2 单文件存储的增长可以通过文件字节数直接观测,实测部署初期 marmotta.mv.db 为 282,624 字节,经一轮 SPARQL 写入与 LDP 资源创建操作后增长到 401,408 字节——按这个斜率评估,千万级三元组大约落在数百 MB 到 GB 级别,磁盘规划留出数倍余量即可。日常巡检建议固定为一组五条命令:status 层面 curl 管理首页与 /ldp 各取状态码;数据层面查 db 文件字节数与最近修改时间判断写入是否持续;日志层面 tail marmotta-main.log 末尾 20 行看有无 ERROR;进程层面确认 Tomcat 进程命令行中 JAVA_HOME 与堆参数与第五节一致;安全层面核对 marmotta-security.log 最近一次约束装载时间。五条命令全部通过,即可认为部署实例处于健康稳态。
九、常见安装问题排查
启动后首页 500,日志出现 ObjectStreamClass$Caches 相关 ClassCastException。 原因是 Tomcat 跑在高于 Java 8 的版本上。按第五节把 /etc/default/tomcat9 的 JAVA_HOME 固定为 JDK 8 并重启服务即可,不要依赖系统默认 java。
首页报错,日志出现 could not create directory /opt/marmotta/home/config。 原因是 systemd 的 ProtectSystem=strict 禁止服务写该路径。按第六节创建 override.conf 放行 ReadWritePaths 并 daemon-reload 后重启。
管理页面 500,日志出现 JSP 编译或 ecj 版本错误。 原因是系统自带 JSP 编译器目标字节码版本高于 Java 8。按第七节替换 ecj 为 3.13.101 版本。
访问 /marmotta/sparql/select 返回 400。 这不是故障。该端点要求 query 参数,空参访问即返回 400,属于端点健康的表现。
下载速度过慢或中断。 47MB 的 installer 包在普通链路上下载较慢,可使用支持多连接的下载工具(如 aria2c -x8)并保留 .sha1 校验文件在下载完成后立即比对。
家目录属主错误导致初始化失败。 家目录必须对运行 Tomcat 的用户(Ubuntu 源包默认为 tomcat)可写,用 chown -R tomcat:tomcat 修正后重启。
8080 端口被占用导致 Tomcat 起不来。 检查 /var/log/tomcat9/ 下日志确认绑定失败后,修改 /etc/tomcat9/server.xml 中的 Connector port 或停用占用方。
重启后数据丢失。 多为家目录被指向了临时路径所致,确认 marmotta.xml 的 value 指向持久化目录(如 /opt/marmotta/home),不要放在 /tmp 之下。
多实例部署后配置互相串改。 同一台 Tomcat 部署多个 Marmotta war 时,每个 war 名对应一套 Context 参数与家目录,若两个实例共用家目录,后启动者会覆盖前者的 config 内容。排查入口是对比两个 Context 文件的 value 与对应家目录下 system-config.properties 的修改时间。
SPARQL 写入成功但重启后数据消失。 除家目录指错外,还需确认 db 子目录对 tomcat 用户可写且落盘路径未被沙箱拦下。定位方法:写入一条测试数据后立即检查 marmotta.mv.db 的字节数与修改时间是否变化,文件不更新说明写入没有真正落盘,回到第六节复核 ReadWritePaths 与目录属主。
十、卸载方式
按部署步骤逆向清理即可,以下命令可完整移除 Marmotta 及其运行环境:
sudo systemctl stop tomcat9
sudo rm -f /var/lib/tomcat9/webapps/marmotta.war
sudo rm -rf /var/lib/tomcat9/webapps/marmotta
sudo rm -f /etc/tomcat9/Catalina/localhost/marmotta.xml
sudo rm -f /etc/systemd/system/tomcat9.service.d/override.conf
sudo systemctl daemon-reload
sudo rm -rf /opt/marmotta
sudo rm -f /opt/downloads/apache-marmotta-3.4.0-*
若连同 Tomcat 与 Java 8 一并退役:
sudo apt-get purge -y tomcat9
sudo apt-get purge -y openjdk-8-jdk
sudo apt-get autoremove -y
卸载前如需留存数据,先备份 /opt/marmotta/home/db/ 目录(停服状态下拷贝 marmotta.mv.db)。
卸载的完整性验证与备份纪律同样重要。验证用一组三条命令收口:curl 8080 应返回连接失败、/var/lib/tomcat9/webapps/ 下不应再有 marmotta 相关条目、/opt/marmotta 应不存在;同时用 systemctl status tomcat9 确认服务状态符合预期(若 Tomcat 一并卸载则为 not found)。备份纪律上,停服状态拷贝 marmotta.mv.db 是保证 H2 文件一致性的关键——运行中拷贝可能拿到处于写一半状态的页,恢复时损坏;若必须热备份,应通过 SPARQL 先落一个事务边界再尽快拷贝,并在恢复后用 COUNT 查询核对三元组数量作为验收口径。
十一、常见问题(FAQ)
1. 必须用 JDK 8 吗?能否用更新的 Java? 3.4.0 按 Java 8 时代构建,高版本 Java 实测在应用首页即抛序列化相关 ClassCastException。遗产系统部署请锁定 JDK 8。
2. installer 包和 webapp 包有什么区别?该下哪个? installer 是 47MB 的完整安装档,带交互安装向导与全部模块源码;webapp 是 37MB 的精简档,只含 marmotta.war。war 部署路线只需 webapp 包,但建议保留 installer 的 .sha1 一并核验发行完整性。
3. marmotta.home 能否放在应用默认位置不配置? 可以启动,但不利于备份与迁移。实测通过 Context 参数指向 /opt/marmotta/home 后,config/db/log 等目录全部集中生成在该路径下,运维收益明显。
4. 为什么需要改 systemd 配置?不改会怎样? Ubuntu 源内 Tomcat 9 启用 ProtectSystem=strict,默认全盘只读;Marmotta 首启要在家目录建目录写库,不放行 ReadWritePaths 就会报 could not create directory 而初始化失败。
5. 堆内存 256-512MB 够用吗?如何确认生效? 中小规模知识库(百万级三元组以内)实测够用。重启后用 ps -ef | grep [j]ava 查看命令行,确认含 -Xms256m -Xmx512m 即已生效;数据量增长后优先上调 -Xmx。
6. 部署后如何快速判断服务健康? 三条依据:访问 /marmotta/ 返回 302 且跳到 core/admin/about.html;POST /marmotta/ldp 的响应头含 Server: Apache Marmotta/3.4.0 (build 0);/opt/marmotta/home/ 下出现完整子目录结构。
7. war 部署后 /var/lib/tomcat9/webapps/ 下为什么有 marmotta 目录? Tomcat 在首次访问时把 war 自动解包为同名目录,属正常行为;升级版本时应同时删除旧 war 与旧解包目录再放新包。
8. 数据库必须用 H2 吗?何时切换? 体验与中小规模部署用默认 H2 零依赖最省事;并发写入明显、数据量大或需要外部备份体系时,按 system-config.properties 中的 database.* 配置项切换到 MySQL/PostgreSQL。
9. ecj 替换会影响系统其他组件吗? 该包是 Tomcat 9 的依赖,替换符号链接后其他使用同一链接的 Tomcat 应用共享新版本。3.13.101 对普通 JSP 完全兼容,若有其他应用依赖高版本语法特性,建议为本部署独立规划运行环境。
10. 项目已退役,部署时还需要关注安全吗? 需要且更加必要。3.4.0 后无安全补丁,建议:仅在内网提供服务、Web 端口不对公网开放、管理界面按需启用账户鉴权、定期备份并保持系统其余部分及时更新。此外部署后应核对 marmotta-security.log 中装载的默认约束与 system-config.properties 中 security.restriction 前缀条目,按需收紧。
11. db 文件多大算正常,备份按什么口径做? 初始 282,624 字节,实测一轮写入后增长到 401,408 字节,随三元组数量增长。备份口径为家目录的 db 与 config 两个子目录(停写期间做文件级拷贝即可保证一致性),log 与 resources 无需纳入备份。
12. marmotta-debug.log 一直是空的,是不是日志配置坏了? 不是。该文件是调试专用通道,默认级别下不产生输出(实测 0 字节)。需要时把目标模块日志级别调到 debug 并重启,输出才会出现;日常巡检关注 marmotta-main.log 即可。
13. 能在同一台机器上跑多个 Marmotta 实例吗? 可以,注意三点:每个 war 用不同文件名(如 marmotta-a.war 与 marmotta-b.war)、各自建立独立的 Context 描述文件指向不同家目录、堆内存按实例数叠加重新评估(单实例 512MB 上限时两实例应按 1GB 以上预算)。家目录不隔离是最常见的翻车点,会造成配置与数据互相覆盖。
参考链接
- Marmotta 3.4.0 发行目录:https://dlcdn.apache.org/marmotta/3.4.0/
- Apache Attic 项目页:https://attic.apache.org/projects/marmotta.html
- 官网部署文档(退役快照):https://marmotta.apache.org/documentation.html
- ecj 3.13.101 发行位置:https://repo1.maven.org/maven2/org/eclipse/jdt/ecj/3.13.101/
- Tomcat 9 Context 配置参考:https://tomcat.apache.org/tomcat-9.0-doc/config/context.html
- Ubuntu systemd 附加单元文档:https://manpages.ubuntu.com/manpages/jammy/man5/systemd.unit.5.html