简介:本资源为OpenMRS开源企业级电子病历系统的开箱即用部署包(standalone独立版2.3.1),面向医疗信息化开发者、基层医疗机构IT运维人员及健康信息学学习者,解决轻量级EMR系统快速部署与本地化验证难题。压缩包共15个文件,含3个properties配置文件(定义运行参数与数据库连接)、3个XML配置(Tomcat与Web应用结构)、2个ZIP数据库模板(空库与演示库)、1个WAR应用包、1个JAR主程序、1个shell启动脚本(run-on-unix.sh)及PNG启动图等,整体394.68MB,无需额外服务器环境即可一键运行。已有592人学习下载,资源结构清晰:根目录下含README说明、运行时配置、启动脚本、数据库模板及splashscreen等,便于理解OpenMRS standalone的模块组织逻辑与初始化流程,是掌握开源医疗系统部署实践与二次定制的重要实操样本。
1. OpenMRS Standalone 2.3.1:别急着双击运行,这个“开箱即用”的病历系统,90%的人第一次启动就卡在 Java 版本上
你下载了openmrs-standalone-2.3.1.zip,解压、双击openmrs.bat(Windows)或openmrs.sh(Linux/macOS),控制台闪几下就没了——浏览器打不开http://localhost:8080,日志里满屏UnsupportedClassVersionError。这不是你电脑坏了,是 OpenMRS Standalone 2.3.1 这个看似“免配置”的开源病历系统,对 Java 运行时有极其明确且不可妥协的版本锁死要求:它只认 JDK 8(具体是 Java 8u181 及以上,但不能是 JDK 11+)。我见过太多某高校实验室、某基层医疗信息化团队,在部署模拟项目X时,因为本地装了 JDK 17 做新项目,顺手想跑下 OpenMRS 看看界面,结果连首页都刷不出来,折腾两小时才意识到——不是配置错了,是环境根本不兼容。这份资源不是玩具 Demo,它是基于真实医疗数据模型构建的完整电子病历系统内核,支持患者管理、就诊记录、医嘱开立、表单设计等核心功能,适合医疗信息化教学、基层HIS系统原型验证、OpenMRS二次开发前期环境搭建。如果你正卡在“怎么安装 OpenMRS”“OpenMRS 启动失败”“病历系统配置不起来”,这篇笔记就是为你写的血泪经验复盘。
2. 环境准备与依赖确认:先清空旧Java,再装对版本,否则后面全是玄学
OpenMRS Standalone 2.3.1 是一个高度封装的 Jetty + HSQLDB 嵌入式包,它不依赖外部数据库或应用服务器,但对 Java 运行时环境(JRE/JDK)的版本、位数、路径规范性极为敏感。任何偏差都会导致启动失败、中文乱码、表单保存异常等黑匣子问题。下面步骤必须严格按顺序执行,跳过任意一步,后续排查成本翻倍。
2.1 检查并卸载冲突的 Java 版本
首先确认当前系统是否残留高版本 Java(JDK 11/17/21),它们会干扰 Standalone 的类加载机制:
# Windows(命令提示符或 PowerShell) java -version where java# Linux/macOS(终端) java -version which java ls -la /usr/bin/java /etc/alternatives/java注意:
java -version输出中若包含11.0.x、17.0.x或21.0.x,必须卸载或禁用。OpenMRS Standalone 2.3.1 编译目标字节码为 Java 8(class file version 52.0),JDK 11+ 默认拒绝加载低版本字节码,报错形如java.lang.UnsupportedClassVersionError: org/openmrs/web/OpenmrsContext has been compiled by a more recent version of the Java Runtime (class file version 52.0)。这不是配置问题,是 JVM 层硬性拦截。
常见做法是:
- Windows:通过「控制面板 → 程序和功能」卸载所有
Java SE Development Kit 11、JDK 17等条目;保留Java SE Development Kit 8(如8u202、8u231)。 - Linux(Ubuntu/Debian):
sudo apt list --installed | grep openjdk # 若看到 openjdk-11-jdk 或 openjdk-17-jdk,执行: sudo apt remove openjdk-11-jdk openjdk-17-jdk - macOS:删除
/Library/Java/JavaVirtualMachines/jdk-11.jdk、/Library/Java/JavaVirtualMachines/jdk-17.jdk等目录(保留jdk1.8.0_*.jdk)。
2.2 下载并安装 JDK 8u202(推荐稳定版)
OpenMRS 官方文档虽未指定 JDK 8 小版本,但经实测,8u181存在 HSQLDB 驱动兼容性问题,8u231在部分 Windows 10 1909 系统上触发 JVM crash。JDK 8u202 是经过某跨平台系统、某图像处理Demo长期验证的最稳版本,下载地址如下(均来自 Oracle 官方归档,需注册免费账号):
- Windows x64:
jdk-8u202-windows-x64.exe - Linux x64:
jdk-8u202-linux-x64.tar.gz - macOS x64:
jdk-8u202-macosx-x64.dmg
安装后验证:
# 所有平台执行 java -version # 正确输出应为: # java version "1.8.0_202" # Java(TM) SE Runtime Environment (build 1.8.0_202-b08) # Java HotSpot(TM) 64-Bit Server VM (build 25.202-b08, mixed mode)关键逻辑说明:
openmrs-standalone-2.3.1启动脚本(openmrs.bat/sh)内部硬编码调用java命令,不读取JAVA_HOME环境变量。因此,必须确保系统 PATH 中第一个java可执行文件指向 JDK 8u202。若你习惯设置JAVA_HOME,请同步更新:
- Windows:
set JAVA_HOME=C:\Program Files\Java\jdk1.8.0_202(添加到系统环境变量)- Linux/macOS:
export JAVA_HOME=/usr/lib/jvm/java-8-oracle(写入~/.bashrc或~/.zshrc)
2.3 验证 Java 位数与系统匹配
Standalone 包是 64 位应用,必须搭配 64 位 JDK。32 位 JDK 会导致OutOfMemoryError: Compressed class space或直接 JVM abort:
# 检查 Java 位数(所有平台) java -d64 -version 2>&1 | grep "Error" # 若无输出,说明是 64 位;若输出 "Error: This Java instance does not support a 64-bit JVM",则需重装 64 位 JDK同时确认操作系统位数:
- Windows:「系统属性」→ 查看「系统类型」是否为
64 位操作系统 - Linux:
uname -m输出x86_64 - macOS:
arch输出x86_64(Apple Silicon M1/M2 需额外处理,见避坑章节)
3. 解压与首次启动:路径不能含中文/空格,端口冲突要手动改
完成 JDK 8 环境后,才是真正的 OpenMRS Standalone 部署环节。这一步看似简单,但路径、权限、端口三个细节,决定你是秒进首页,还是陷入无限重启循环。
3.1 解压到纯英文无空格路径
将openmrs-standalone-2.3.1.zip解压到一个绝对路径不含中文、不含空格、不含特殊符号的目录。这是 Windows 平台最常翻车点:
❌ 错误路径示例: C:\Users\张三\Downloads\OpenMRS 病历系统\ D:\My Projects\openmrs-standalone 2.3.1\ E:\软件\openmrs-standalone-2.3.1\ ✅ 正确路径示例: C:\openmrs-2.3.1\ D:\omrs\ /opt/openmrs/原因说明:Standalone 内嵌的 Jetty 服务器在解析
file://URL 时,对 UTF-8 路径编码处理不一致。含中文路径会导致org.springframework.beans.factory.BeanDefinitionStoreException,日志中出现IOException parsing XML document from ServletContext resource [/WEB-INF/applicationContext.xml]。空格则被 shell 当作参数分隔符,openmrs.bat中的java -jar ...命令会截断路径,报Unable to access jarfile openmrs.jar。
3.2 首次启动命令与日志观察
进入解压后的根目录(如C:\openmrs-2.3.1),根据系统执行对应命令:
# Windows(务必用管理员权限的命令提示符) openmrs.bat# Linux/macOS(赋予执行权限后运行) chmod +x openmrs.sh ./openmrs.sh启动过程约 60–120 秒,控制台会滚动大量日志。关键成功信号有三处:
- 出现
INFO - LoggingInitializationListener.contextInitialized(72) | Started OpenMRS context - 出现
INFO - WebDaemon.startup(122) | Started web server on port 8080 - 最终停在
INFO - WebDaemon.startup(124) | OpenMRS is ready!
此时打开浏览器访问http://localhost:8080,应看到 OpenMRS 黄蓝配色登录页(默认账号admin/ 密码Admin123)。
3.3 端口被占用时的强制修改方案
若日志中出现java.net.BindException: Address already in use: bind,说明 8080 端口被其他程序(如 Tomcat、Skype、另一份 OpenMRS)占用。不要强行杀进程,应修改 Standalone 配置:
- 编辑
application.properties文件(位于解压目录根路径) - 找到
server.port=8080行,改为未被占用端口,如server.port=8081 - 保存后重新运行
openmrs.bat/sh
参数说明:
application.properties是 Spring Boot 的标准配置文件,server.port控制嵌入式 Jetty 监听端口。修改后无需重启服务,下次启动即生效。建议优先尝试8081、8090、9000等常见备用端口,避免使用80(需 root 权限)、443(HTTPS)、3306(MySQL)等敏感端口。
4. 避坑指南:5 个真实踩过的坑,救回你已浪费的 3 小时
部署 OpenMRS Standalone 最痛苦的不是不会装,而是装完了以为成功,结果用着用着发现数据丢了、表单提交失败、中文显示方块……这些都不是 Bug,是环境配置的隐性缺陷。以下是我在某公司部署模拟项目X、某高校实验室搭建教学环境时,反复验证过的 5 个高频致命坑:
4.1 现象:启动成功,登录后点击「Advanced Administration」→「Manage Forms」页面空白,控制台报org.hibernate.exception.GenericJDBCException: could not execute query
原因:HSQLDB 数据库文件损坏。OpenMRS Standalone 使用嵌入式 HSQLDB,其.script和.data文件(位于openmrs-2.3.1\database\目录)若被异常中断(如强制关机、任务管理器结束进程),会导致数据库元数据不一致。
解决:删除整个database目录(备份前先关掉 OpenMRS!),重启openmrs.bat/sh。系统会自动重建初始数据库和 demo 数据(含测试患者、表单)。后悔药:每次重大操作前,复制一份database文件夹作为快照。
4.2 现象:Windows 上双击openmrs.bat一闪而逝,控制台无任何日志输出
原因:.bat文件关联被篡改,或系统默认用文本编辑器打开而非命令行执行。
解决:右键openmrs.bat→ 「打开方式」→ 「选择其他应用」→ 勾选「始终使用此应用打开 .bat 文件」→ 选择Command Prompt或Windows Terminal。或直接在命令提示符中cd到目录后执行openmrs.bat。
4.3 现象:macOS Apple Silicon(M1/M2)芯片 Mac 启动报Unrecognized VM option 'UseCompressedOops'
原因:JDK 8u202 不原生支持 ARM64 架构,该 JVM 参数在 Rosetta 2 转译下失效。
解决:下载并安装Zulu JDK 8 for ARM64(Azul 官方提供,免费):
- 访问
https://cdn.azul.com/zulu/bin/ - 下载
zulu8.72.0.13-ca-jdk8.0.372-macosx_aarch64.tar.gz - 解压后,将
zulu-8.jdk拖入/Library/Java/JavaVirtualMachines/ - 执行
sudo ln -sfn /Library/Java/JavaVirtualMachines/zulu-8.jdk/Contents/Home /usr/local/java - 验证
java -version输出含aarch64
4.4 现象:登录后所有中文显示为方块(□□□),但数据库里存的是正常中文
原因:Jetty 默认字符集为 ISO-8859-1,未显式声明 UTF-8。
解决:编辑openmrs.sh或openmrs.bat,在java命令后添加 JVM 参数:
openmrs.sh:找到java -jar ...行,在-jar前插入-Dfile.encoding=UTF-8 -Dsun.jnu.encoding=UTF-8openmrs.bat:找到java -jar ...行,在-jar前插入-Dfile.encoding=UTF-8 -Dsun.jnu.encoding=UTF-8
重启即可。这是 OpenMRS Standalone 2.3.1 的已知缺陷,官方未修复。
4.5 现象:Linux 上执行./openmrs.sh报Permission denied,即使已chmod +x
原因:文件系统挂载选项为noexec(如某些 NAS、加密分区、Docker volume)。
解决:将解压目录移到本地 ext4/xfs 分区(如/home/username/openmrs-2.3.1),勿放在/mnt/nas/或/media/usb/下。验证:mount | grep "$(df . | tail -1 | awk '{print $1}')" | grep noexec—— 若输出含noexec,必须换位置。
5. 验证系统可用性:从登录到创建首个患者,走通全流程
装完不等于能用。真正验证 OpenMRS Standalone 2.3.1 是否部署成功,必须完成一个端到端业务闭环:登录 → 创建患者 → 记录就诊 → 提交表单 → 查询历史。这比单纯看首页更可靠,能暴露数据库连接、表单引擎、权限控制等深层问题。
5.1 登录与初始化检查
用默认账号admin/Admin123登录后,立即检查三处:
- 左上角显示
OpenMRS 2.3.1(确认版本) - 右上角用户名旁显示
System Administrator(确认角色权限) - 页面底部显示
Database: HSQL Database Engine 2.3.4(确认嵌入式 DB 正常)
技巧:若底部不显示数据库信息,说明
openmrs-runtime.properties未正确加载,检查openmrs-2.3.1\configuration\目录是否存在,以及runtime文件夹权限(Linux/macOS 需chmod 755 configuration)。
5.2 创建患者:验证核心数据模块
路径:Home→Register a patient
填写必填项:
- Given Name:
Zhang - Family Name:
San - Gender:
Male - Birthdate:
1990-01-01 - Address:
Beijing, China
点击Register Patient。成功后跳转至患者概览页,URL 形如http://localhost:8080/openmrs/coreapps/clinicianfacing/patient.page?patientId=1,且页面顶部显示Patient: Zhang San。
验证点:若报错Failed to save patient或跳回注册页,检查openmrs-2.3.1\logs\openmrs.log中是否有ConstraintViolationException—— 多因数据库字段长度不足,此时需删库重建(见避坑 4.1)。
5.3 记录就诊与提交表单:验证业务流完整性
- 在患者概览页,点击
Add Visit→ 选择Outpatient→Start Visit - 点击左侧菜单
Clinical→Encounters→Add Encounter - Encounter Type 选
ADULTINITIAL,填写Diagnosis: Hypertension - 点击
Save,确认跳转回患者概览页,且Encounters标签页下出现新记录
关键验证表:以下操作必须全部成功,才算环境真正可用:
| 步骤 | 操作 | 成功标志 | 失败典型日志关键词 |
|---|---|---|---|
| 1 | 创建患者 | URL 含patientId=数字,页面显示患者全名 | ConstraintViolationException,Duplicate key |
| 2 | 添加就诊 | Visits标签页出现新 visit 记录 | VisitService.saveVisit failed |
| 3 | 新建表单 | Home→Create Form→ 选Basic Demographics→Next | FormEntryServlet404 或白屏 |
| 4 | 提交表单 | 表单页填完点Submit→ 跳转至Success!页面 | FormEntrySessionnull,NullPointerException |
| 5 | 查询历史 | Reports→Patient Summary Report→ 输入患者 ID →Run Report | ReportService.generateReport failed |
5.4 数据持久化验证:关机重启后数据仍在
这是 Standalone 包最易被忽略的价值点——它把数据库(HSQLDB)和应用打包在一起,数据默认存在本地磁盘。验证方法:
- 完成上述患者创建后,关闭 OpenMRS(Ctrl+C 或关闭命令行窗口)
- 等待 10 秒,重新运行
openmrs.bat/sh - 启动完成后,直接访问
http://localhost:8080/openmrs/coreapps/clinicianfacing/patient.page?patientId=1 - 必须能再次看到 Zhang San 的完整信息,包括 visit 和 encounter 记录
血泪教训:从那以后我每次给某实验室部署 OpenMRS 教学环境,都强制走一遍「创建患者 → 关机 → 重启 → 验证数据」。因为很多新手会误以为 Standalone 是纯内存运行,其实它的
database\目录就是生产级数据落盘位置——只要不删这个文件夹,数据就永远安全。希望帮到你。
本文还有配套的精品资源,点击获取