第一天到岗,leader 只丢下一句话:“先把本地环境跑起来,能登进去就算过关。”我原本以为这是个把压缩包解压、点两下启动脚本就完事的活儿,结果真正动手才发现,泛微 ecology9 在 Windows 上的本地部署,坑密度远超想象:JDK 版本不对、数据库排序规则选错、检索服务起不来、端口被占用、内存参数配小了页面直接卡死。这篇就是我把整个流程从头跑通之后的完整复盘,从环境准备到第一次成功登录,每一步为什么这么做、哪里最容易翻车,我都尽量写清楚。不管你是刚进项目组的新人,还是需要在本机搭一套演示环境的实施或者开发,看完应该能少走大半天弯路。
1. 部署之前先想清楚:ecology9 本地跑起来到底要什么
很多人第一步就急着去下载安装包,结果下到一半发现版本不匹配,或者装完 JDK 又发现数据库版本太低。我建议先把这张“地图”画清楚,后面每一步都会顺畅很多。
1.1 这套系统到底由哪些零件拼起来
ecology9 不是那种双击 exe 就能跑的桌面软件,它是一个典型的 Java Web 应用,背后还挂着好几个基础服务。你可以把它理解成一家餐厅:数据库是冷库,负责存原料;Redis 是前台小本子,负责记那些高频查询的临时信息;Elasticsearch 是检索台,负责让你搜索文档、流程、附件的时候能秒出结果;中间件是餐厅的大堂和厨师团队,负责把请求接进来再分发给后端逻辑;JDK 则是这家餐厅必须的“水电”,没有它全都动不了。
我一开始只装了 JDK 和数据库,结果应用能启动、页面能登录,但一进全文检索就报错,翻了半天日志才反应过来是检索服务没部署。所以先把组件全景列出来,是避免“半通不通”状态的关键。完整清单大概是这些:
- JDK:应用运行的根基,ecology9 对版本有明确要求
- 数据库:SQL Server、Oracle 或 MySQL 都可能,取决于你拿到的脚本包
- Redis:缓存与会话,集群或高并发场景下几乎是必需品
- Elasticsearch:全文检索,缺了它功能会残废但不会立刻崩
- 应用中间件:随包附带的 Tomcat,或者自己准备的同类容器
- 授权文件:从官方渠道获取,放对位置才能正常进入系统
注意:本地搭建通常用于开发和演示,具体支持的组件版本、授权方式,一定要以你手上那份安装手册和官方文档为准,不要凭记忆硬套。
1.2 硬件与版本清单:别上来就下载
我第一台机器是 8G 内存的笔记本,装到一半就开始卡。这不是软件的问题,而是这几个服务加起来对内存的胃口确实不小。后来我整理了一份相对稳妥的规划,你可以对照自己的机器做取舍。
| 机器内存 | 数据库 | 检索服务 | 应用中间件 | 缓存 | 系统预留 |
|---|---|---|---|---|---|
| 8GB | 2GB | 2GB | 2GB | 512MB | 1.5GB |
| 16GB | 4GB | 4GB | 4GB | 1GB | 3GB |
| 32GB | 8GB | 8GB | 8GB | 2GB | 6GB |
端口也要提前规划,不然装到一半发现某个端口被别的软件占了,排查起来很烦。下面这张表是我本机实际用的一套,你可以照抄:
| 组件 | 用途 | 本机端口 |
|---|---|---|
| 数据库 | 业务数据存储 | 1433(SQL Server)/ 3306(MySQL) |
| Redis | 缓存、会话 | 6379 |
| 检索服务 | 全文检索 | 9200、9300 |
| 应用中间件 | Web 服务 | 8080 |
把这些写在纸上贴在显示器旁边,后面每配一个服务就回来打一个勾,这种“仪式感”其实很能减少遗漏。我踩过的最冤的一次坑,就是数据库端口配成了 3306,但服务器上跑的是 SQL Server,连了半天连不上,最后发现是自己复制粘贴的时候没改。
2. 基础环境搭建:JDK、数据库、缓存与检索四件套
这一部分是整个部署里耗时最长的,因为四个组件互相独立,任何一个没弄好都会在后面暴露成“莫名其妙”的报错。我的建议是每装完一个就单独验证一次,不要四个都装完再统一测,否则出问题你根本不知道是谁的锅。
2.1 JDK 的选择与 Windows 环境变量
ecology9 常见的运行环境是 JDK 1.8,部分较新的版本包对更高版本的 JDK 也有支持,但这件事千万不能“我觉得”。我第一天就是自作聪明装了最新版 JDK,结果启动到一半就抛各种奇怪的兼容错误。正确做法是打开安装手册,确认它要求的版本区间,然后在区间内挑一个你熟悉的版本。
安装完 JDK 之后,Windows 上要配三个东西:
- 新建系统变量
JAVA_HOME,值指向 JDK 的安装根目录,注意不要带\bin这一层。 - 编辑
Path,新增一条%JAVA_HOME%\bin。 - 可选配置
CLASSPATH,现代 JDK 一般不需要,但如果手册里写了就照做。
验证很简单,打开一个新的命令行窗口,执行:
java -version javac -version两行都能正常输出版本号,说明配置生效。这里有个细节很多人会忽略:如果你不重新开一个命令行窗口,环境变量是不会刷新的。我第一次配完一直报“不是内部或外部命令”,折腾了十分钟才发现是窗口没重开。
注意:安装路径尽量避开中文和空格,比如放在
D:\dev\jdk1.8这种位置,而不是C:\Program Files\我的开发工具。Java 生态里因为路径空格导致的诡异问题真的不少,提前规避比事后排查省事得多。
2.2 数据库建库:排序规则这一步最容易翻车
数据库是整个部署里我花时间最多的一块。原因不是安装难,而是建库时的排序规则和字符集选择,一旦选错,后面所有中文数据都可能是乱码,而且改起来极其麻烦,往往要删库重来。
如果你用 SQL Server,安装时注意实例的排序规则,建库时选择Chinese_PRC_CI_AS这类支持中文的排序规则。CI 表示不区分大小写,AS 表示区分重音符号,这是比较通用的组合。如果你用 MySQL,建库语句里要明确指定字符集:
CREATE DATABASE ecology DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;为什么强调 utf8mb4?因为 MySQL 里老的 utf8 实际上是三字节的,遇到某些特殊字符(比如一些生僻字)会存不进去。utf8mb4 才是真正完整的四字节实现,新建库没理由不用。
建库完成之后,最好单独创建一个应用专用账号,而不是直接用 sa 或者 root 去连应用。原因有两点:一是权限最小化,应用账号只需要目标库的读写权限;二是以后换环境、迁移的时候,把账号密码一换就行,不用动其他配置。创建账号的时候记得给它授予目标库的读写和建表权限,否则初始化脚本执行到一半就会因为权限不足报错。
我在这一步还踩过一个细节坑:SQL Server 默认可能没开 TCP/IP 协议,导致应用连不上。要去配置管理器里把对应实例的 TCP/IP 协议启用,并且确认端口是 1433,改完记得重启数据库服务。
2.3 Redis 本地实例的准备
Redis 在本地的作用主要是缓存和会话共享。单独的 Windows 机器上跑一个单实例就够了,重点是配置要合理。
需要关注的配置项其实就几个,我列一下我本机的设置:
| 配置项 | 建议值 | 说明 |
|---|---|---|
| bind | 127.0.0.1 | 本地开发只允许本机访问,更安全 |
| port | 6379 | 默认端口 |
| requirepass | 设置一个密码 | 避免裸奔 |
| maxmemory | 512mb ~ 1gb | 按机器内存调整 |
| maxmemory-policy | allkeys-lru | 内存满了淘汰最久未用的键 |
maxmemory-policy这一项很多人不配,结果跑久了内存涨到把机器拖垮。allkeys-lru的意思是内存到达上限后,优先淘汰最近最少使用的键,对缓存场景比较友好。
启动之后,用客户端连一下,执行ping,返回PONG就说明正常。如果你设置了密码,连接时要用auth 密码,应用配置里也别忘了填密码,否则应用连 Redis 会认证失败。
注意:本地开发建议把 bind 限制在 127.0.0.1,不要图方便设成 0.0.0.0。同个局域网里别人能扫到你的端口,既影响安全也可能被别人误连干扰。
2.4 Elasticsearch 在 Windows 上的启动要点
检索服务是这几个组件里最容易“起不来”的一个。它的启动脚本在 Windows 上就是个 bat,但配置不对会反复退出。
第一个要改的是内存配置,在config\jvm.options里:
-Xms2g -Xmx2g经验上Xms和Xmx设成一致比较好,避免运行时反复扩缩容。数值不要超过物理内存的一半,也不要设得比机器实际可用内存还大,否则启动时直接因为申请不到内存而失败。
第二个要改的是config\elasticsearch.yml:
cluster.name: ecology-local node.name: node-1 network.host: 127.0.0.1 http.port: 9200 discovery.type: single-nodediscovery.type: single-node这个配置很关键。因为一旦你把network.host从默认值改成了具体地址,检索服务就会触发一系列启动前的检查,单节点环境下很容易过不去;显式声明单节点模式可以跳过那些为集群准备的检查。我第一次就是卡在这里,日志里一堆检查失败,看得一头雾水。
注意:安装目录同样不要有中文和空格。这个服务对路径特别敏感,路径里带空格经常导致启动脚本解析异常。
启动之后,浏览器访问http://127.0.0.1:9200,能看到一段包含版本号、集群名的 JSON 就说明它活了。这一步验证通过,才算真正把四件套准备齐。
3. ecology9 应用本身的部署与配置
前面四个服务都是“地基”,从这里开始才是把应用本身放上去。这一部分的核心思路是:先让应用能连上数据库,再让它能跑起来,最后再调优。顺序不要乱。
3.1 目录结构与配置文件的位置
把应用包解压到一个干净的目录,比如D:\ecology,注意根目录别套太多层。解压完之后你会看到一堆文件夹,第一次看确实有点晕,我挑几个关键的说说:
WEB-INF:核心配置和类文件都在这儿,权限文件、日志配置、连接配置基本都在这个目录下面- 配置目录:数据库连接、系统参数这类文件一般放在
WEB-INF下的配置文件夹里,文件名通常和“属性、配置”相关 - 中间件相关目录:如果随包附带了中间件,启动脚本、日志目录一般独立放在外面
- 附件与数据目录:用户上传的附件、生成的临时文件会落在这里,建议单独规划盘符
第一次进去不要乱改,先把这几个目录的作用记住,后面排查问题的时候你至少知道该去哪个日志文件里翻。尤其要记住日志目录的位置,因为本地部署 90% 的问题都要靠日志来定位。
3.2 数据库连接配置怎么填
连接配置是整个部署的“咽喉”。它一般是一个 properties 文件,内容大致长这样:
driverClassName=com.microsoft.sqlserver.jdbc.SQLServerDriver url=jdbc:sqlserver://127.0.0.1:1433;DatabaseName=ecology username=ecology_user password=你的密码几个容易出错的点我逐个说:
第一,driverClassName必须和数据库类型对上。SQL Server 用com.microsoft.sqlserver.jdbc.SQLServerDriver,MySQL 用com.mysql.cj.jdbc.Driver,Oracle 又是另一套。写错了会在启动时抛“找不到驱动类”。
第二,url里的主机、端口、库名要和实际一致。DatabaseName这种参数名大小写敏感度不高,但拼错就是连接失败。
第三,驱动 jar 包要放进应用能加载到的目录里。有些安装包里自带了驱动,有些需要你自己补。判断方法很简单:如果日志报ClassNotFoundException,八成就是驱动没放对位置。
注意:配置文件里如果有中文注释,保存的时候一定要用 UTF-8 编码,别用系统默认编码,否则注释乱码事小,把配置值也带乱了才麻烦。
3.3 初始化脚本与数据导入
应用代码只是“壳”,真正的表结构和初始数据都在 SQL 脚本里。这一步的流程是:连接到你刚建好的库,执行初始化和业务表的脚本。
执行顺序很重要,一般先执行建表脚本,再执行初始化数据脚本,最后按需导入演示数据。脚本量可能不小,执行的时候留意有没有中途报错。最怕的是执行到一半报错然后你直接忽略,结果后面启动时各种“表不存在”。
执行完之后,做个简单的核对:查一下库里的表数量,和脚本预期大致对得上;再查几张大表(比如用户表、组织表)有没有基础数据。这个动作花不了一分钟,但能帮你提前发现很多问题。
顺便说一句数据库客户端工具的选择。本地开发用可视化工具确实方便,但建议用官方渠道获取的正版软件,或者直接用开源免费的客户端,功能和稳定性都够用,也省去授权上的麻烦。工具只是工具,不要在这上面给自己埋隐患。
3.4 JVM 内存参数怎么算
应用启动脚本里通常有一行设置 JVM 参数的地方,形如:
set JAVA_OPTS=-Xms2048m -Xmx4096m -XX:MaxMetaspaceSize=512m -XX:+UseG1GC -Dfile.encoding=UTF-8这行参数不是随便填的,我讲一下我的计算思路。假设机器 16G,按前面的分配表,数据库和检索各拿 4G,系统预留 3G,那留给应用的其实就是 4G 左右。所以-Xmx设 4G 是安全上限,-Xms设 2G 让它起步不要太激进。
-XX:MaxMetaspaceSize这个参数控制的是元空间,也就是类元数据占用的内存。设 512M 对于一般应用足够,设小了会在加载大量类的时候抛元空间溢出。
-Dfile.encoding=UTF-8这一项强烈建议加上。Windows 系统默认编码往往是 GBK,而应用内部按 UTF-8 处理,两边不一致就会出现中文乱码。我第一版没加这个参数,登录页面的中文全是方块,加上之后立马正常。
注意:改完启动脚本记得用记事本另存为时选择“所有文件”,别把
.bat存成了.bat.txt。这个坑看起来很低级,但真的有人中招。
4. 第一次启动:验证流程与踩坑实录
一切配好之后,终于到了最紧张的时刻——点启动。但“启动了”和“跑起来了”完全是两回事,下面是我总结的一套验证流程。
4.1 从启动日志判断服务是否真的起来了
启动脚本双击之后,会弹出一个命令行窗口,里面会刷大量日志。不要看到窗口没关就以为成功了,一定要看日志的最后几行。
判断标准大概是这几条:
- 日志里出现类似“启动完成”“服务就绪”的字样,或者显示总耗时
- 没有抛异常堆栈
- 控制台停在等待输入的状态,而不是一闪而过或者卡死
如果窗口一闪就没了,说明启动过程中出错了。这时候不要反复双击,应该去日志文件里找原因,或者用命令行方式启动,让错误留在窗口里。
启动成功之后,浏览器访问http://127.0.0.1:8080/wui/index.html,能看到登录页,说明应用层通了。用初始管理员账号登录(具体账号和初始密码看手册),能进系统,第一关就算过了。
但别急着庆祝,还要做几项功能验证:点开组织架构看看有没有数据、进流程中心随便开一个流程、用搜索框搜个关键词看看检索通不通。这三点分别验证了数据库、流程引擎和检索服务,都通过才算真正“跑起来”。
4.2 常见报错速查表
这部分是我第一天翻日志翻出来的血泪经验,整理成表,遇到问题可以直接对照:
| 现象 | 可能原因 | 排查方向 |
|---|---|---|
| 双击启动窗口一闪而过 | 脚本报错或 JDK 路径不对 | 用命令行启动,保留错误输出 |
| 8080 页面打不开 | 端口被占或应用未启动完 | netstat -ano查端口,看启动日志 |
| 报找不到驱动类 | 驱动 jar 缺失或类名写错 | 检查WEB-INF下的库目录和连接配置 |
| 启动报连接超时 | 数据库未启动或协议未开启 | 先确认数据库服务状态,再测端口连通性 |
| 中文显示成方块 | 编码不一致 | 补上-Dfile.encoding=UTF-8,检查库字符集 |
| 检索报错或超时 | 检索服务未启动 | 浏览器访问 9200 验证,看其日志 |
| 运行一段时间越来越卡 | 堆内存不足,频繁 GC | 调大-Xmx,观察内存占用 |
| 登录报会话异常 | 缓存服务连不上 | 检查 Redis 是否启动、密码是否正确 |
这张表我后来又补了好几条,基本上每次帮同事排查都会往里加一行。建议你也维护一份属于自己的问题清单,这比任何文档都值钱。
4.3 部署完的收尾动作
系统跑起来之后,有几件事是我强烈建议立刻做的,不然下次重启机器可能又要重来一遍。
第一,给整个应用目录做个压缩备份。配置好的环境是很脆弱的,改错一个文件可能就起不来,有备份你随时能回滚。
第二,把这次改过的所有配置项记下来:改了哪个文件、哪一行、改成什么值、为什么改。我当时偷懒没记,第二天调另一个参数的时候把之前的覆盖了,又重新排查了一小时。
第三,确认服务和机器重启的联动关系。本地开发环境一般不会配成开机自启,所以每次重启机器后要按顺序手动拉起:数据库 → 缓存 → 检索 → 应用。顺序错了应用会因为连不上依赖而启动失败。
5. 一些只有踩过才知道的经验
这部分不算流程,算是我个人这两天攒下来的心得,都是文档里不会写、但实际很影响效率的东西。
5.1 版本匹配是最大的坑
我这两天花在版本问题上的时间,比花在配置上的还多。JDK 版本、数据库版本、检索服务版本、应用包版本,这四个之间是有对应关系的,任何一个偏离都可能出问题。所以拿到安装包的第一件事,不是解压,而是先把版本对应关系确认清楚。
还有一个容易被忽略的点:同一个应用包,可能对不同操作系统、不同数据库类型有不同的适配。Windows 上用 SQL Server 的包,和 Linux 上用 MySQL 的包,脚本和配置可能完全不一样。不要拿 A 环境的经验去硬套 B 环境,我在这上面吃过亏——照搬了同事的配置文件,结果驱动类和连接串全不对。
5.2 环境隔离与快照习惯
如果你用的是虚拟机,装完一个干净的、只配好基础环境的状态,一定要打个快照。后面不管怎么折腾,出问题随时能回滚到一个确定能用的状态。这个习惯在本地部署这种“试错成本高”的场景里,简直是救命稻草。
我自己用的是虚拟机装干净系统,配好 JDK 和数据库就打第一个快照,配好缓存和检索打第二个,应用跑通打第三个。这样任何一步出问题,都能快速回到上一步,而不是从零重来。实体机没有快照的话,至少也要做目录级别的备份。
另外,日志目录最好单独关注。本地调试的时候,日志级别可以适当调低一点(比如调到 debug),方便看到更多细节;但记得调回正常级别,不然日志文件会涨得飞快,磁盘很快就被占满。
注意:本地环境的账号密码不要图省事设成空或者极简单的弱口令,即使只是自己用。一方面是不良习惯,另一方面很多工具和服务对弱口令会有额外的限制,反而增加麻烦。
最后分享一个小技巧:把整个部署流程写成一份自己的检查清单,从装 JDK 到验证检索,一条一条列清楚,每完成一条打个勾。我第一次部署用了大半天,第二次照着清单走,四十分钟就跑完了。清单的价值不在于记不住,而在于能让你在出问题时快速定位“是哪一步引入的”,这才是它真正省时间的地方。