离线服务器中部署java项目,项目中有关联启动PhantomJS,然后一直报错启动失败,之前默认以为已经启动了,直到今天去执行导出Word相关功能才发现此项目完全没启动。
首先还是解释一下PhantomJS是什么
# PhantomJS是一个基于WebKit引擎的JavaScript API,可以模拟浏览器行为而不需要图形界面。
我这边主要用来做图片的导出,将网页中的echarts图渲染成对应的图片
问题现象
-
首先排查还是查看对应端口,使用的命令是
netstat -a | grep 1234 -
没有启动后,便单独去启动 ./PhantomJS , 发现报错:
libfontconfig.so.1和libpng15.so.15缺失
$ ./phantomjs --version
error while loading shared libraries: libfontconfig.so.1: cannot open shared object file: No such file or directory
随后安装fontconfig后,又出现新错误:
error while loading shared libraries: libpng15.so.15: cannot open shared object file: No such file or directory
原因分析
依赖链断裂
PhantomJS依赖两个核心库:
-
libfontconfig.so.1 → 字体配置与渲染
-
libpng15.so.15 → PNG图像处理
离线环境无法通过yum自动解决依赖,必须手动获取RPM包。
解决方案
在Windows环境准备RPM包
访问 CentOS 7.9官方归档仓库,下载4个核心包:
表格复制
| 包名 | 下载链接 | 作用 |
|---|---|---|
| fontconfig | fontconfig-2.13.0-4.3.el7.x86_64.rpm | 字体配置核心库 |
| libpng15 | libpng15-1.5.13-8.el7.x86_64.rpm | PNG图像处理 |
| freetype | freetype-2.8-14.el7.x86_64.rpm | 字体渲染引擎 |
| expat | expat-2.1.0-15.el7_9.x86_64.rpm | XML解析库 |
将下载好的核心包进行打包
--javascripttypescriptshellbashsqljsonhtmlcssccppjavarubypythongorustmarkdown
# 将所有rpm放入phantomjs-deps文件夹
tar czvf phantomjs-deps-centos7.tar.gz phantomjs-deps/
在离线服务器进行安装
先清除残留的不兼容库
# 删除之前遗留数据
sudo rm -f /usr/lib64/libfontconfig.so.1*
sudo rm -f /usr/lib64/libpng15.so.15*
# 解压U盘中的部署包
mkdir -p /tmp/phantomjs-install
cd /tmp/phantomjs-install
tar xzf /mnt/usb/phantomjs-deps-centos7.tar.gz
# 按顺序手动安装(--nodeps跳过依赖检查)
sudo rpm -ivh --nodeps --force expat-*.rpm
sudo rpm -ivh --nodeps --force freetype-*.rpm
sudo rpm -ivh --nodeps --force libpng15-*.rpm
sudo rpm -ivh --nodeps --force fontconfig-*.rpm
# 更新动态链接库缓存(关键!)
sudo ldconfig
# 验证安装
ls -l /usr/lib64/libfontconfig.so.1 # → libfontconfig.so.1.10.1
ls -l /usr/lib64/libpng15.so.15 # → libpng15.so.15.13.0
验证PhantomJS
# 1. 检查依赖完整性
ldd /你的路径/phantomjs/bin/phantomjs | grep -E "fontconfig|png15"
# 输出应包含两行,且无"not found"
# 2. 启动测试
./phantomjs --version
# 输出: 2.1.1
# 3. 渲染测试
cat > /tmp/test.js <<'EOF'
var page = require('webpage').create();
page.content = '<h1>中文渲染测试</h1>';
page.render('/tmp/test.png');
phantom.exit();
EOF
./phantomjs /tmp/test.js
ls -lh /tmp/test.png # 文件存在即成功
总结
补齐缺失库需要注意:
-
版本匹配原则:源系统和目标系统的glibc版本必须一致(
ldd --version) -
架构一致性:必须同为
x86_64或aarch64(uname -m) -
纯64位环境:避免混装i686包导致冲突
教训:
-
ldconfig:安装后必须执行,否则系统找不到新库
-
手动安装顺序:先装基础依赖(expat),再装上层库(freetype → libpng15 → fontconfig)
-
自动化脚本:提前写好
download.sh和install.sh,避免现场拼写错误
通过此次排查,一个是问题定位能力,其次是解决问题的逻辑严谨性都得到了深刻体会。