
本文详解在 liferay 7.x 环境下 tomcat 启动行为的特殊性:web 应用并非传统 war 部署,而是通过 osgi 容器动态加载;明确说明 war 文件可能根本不存在于文件系统中,并提供定位、更新与重部署的可靠路径。
本文详解在 liferay 7.x 环境下 tomcat 启动行为的特殊性:web 应用并非传统 war 部署,而是通过 osgi 容器动态加载;明确说明 war 文件可能根本不存在于文件系统中,并提供定位、更新与重部署的可靠路径。
在 Liferay 7.x 及更高版本中,Tomcat 已退居为底层 Servlet 容器载体,而非应用部署管理主体。Liferay 自身构建了一套基于 OSGi(Equinox 或 Felix)的模块化运行时环境,所有 Portlet、Service、Theme 等插件均以 .jar(非 .war)格式作为 OSGi Bundle 进行注册、解析与激活。这意味着:
- ✅ 没有传统意义上的“解压 WAR 到 webapps/”过程:你找不到 webapps/portlet-folder-name.war,是因为它从未被部署为 WAR;
- ✅ tomcat/webapps/ 下通常仅包含 Liferay 核心(如 ROOT、osgi、manager 等)和极少数兼容性适配器,你的自定义插件不会出现在此处;
- ✅ work/ 和 temp/ 目录的清理无效——OSGi Bundle 的缓存位于 liferay-home/osgi/state/、liferay-home/osgi/marketplace/ 或 liferay-home/osgi/modules/,而非 Tomcat 工作目录。
? 如何确认插件实际部署位置?
Liferay 7.x 默认将已部署插件存放于以下路径(以标准安装为例):
# Liferay Home(通常独立于 Tomcat 目录,如 /opt/liferay/data 或 $LIFERAY_HOME) $LIFERAY_HOME/osgi/modules/ # 已安装的模块(.jar) $LIFERAY_HOME/osgi/marketplace/ # 通过控制台上传的插件副本 $LIFERAY_HOME/osgi/war/ # (极少使用)遗留 WAR 插件适配层
⚠️ 注意:$CATALINA_BASE/webapps/ 中的 portlet-folder-name/ 目录,很可能是 Liferay 运行时动态生成的 Web Context 快照(由 OSGi Web Container 构建),并非源文件。你手动替换 WEB-INF/lib/ 中的 JAR,会被下次 Bundle 重启或容器刷新自动覆盖——这正是你观察到“旧 SDK 又回来”的根本原因。
✅ 正确更新 SDK 依赖的操作流程
-
停止 Liferay(非仅 Tomcat)
确保 OSGi 框架完全关闭,避免状态残留:$LIFERAY_HOME/tomcat-*/bin/shutdown.sh # 等待进程退出后再操作
-
更新插件工程的 build.gradle(推荐)
在你的 Liferay Workspace 或 Module Project 中,修改依赖项:dependencies { compileOnly group: "com.example.sdk", name: "my-sdk", version: "2.3.0" // 替换旧版本,然后执行: }运行构建并生成新 .jar:
./gradlew clean build # 输出路径示例:modules/my-portlet/build/libs/my-portlet-1.0.0.jar
-
部署新 Bundle(两种权威方式)
-
方式一:放入 deploy/ 目录(最常用)
将生成的 .jar 复制到 $LIFERAY_HOME/deploy/,启动 Liferay 后自动检测、安装、启动:cp modules/my-portlet/build/libs/my-portlet-1.0.0.jar $LIFERAY_HOME/deploy/ $LIFERAY_HOME/tomcat-*/bin/startup.sh
-
方式二:Gogo Shell 动态卸载/重装(适合调试)
启动后访问 http://localhost:8080/system/console/gogo,或使用 telnet:g! lb | grep my-portlet # 查找 Bundle ID(如 542) g! stop 542 # 停止 g! uninstall 542 # 卸载(彻底移除) g! install file:/path/to/my-portlet-1.0.0.jar # 重新安装 g! start 543 # 启动新 Bundle(ID 可能变化)
-
方式一:放入 deploy/ 目录(最常用)
? 关键注意事项总结
- ❌ 不要直接修改 tomcat/webapps/xxx/WEB-INF/lib/ ——这是运行时快照,非源;
- ❌ 不要依赖 tomcat/work/ 或 temp/ 清理来“刷新依赖”——OSGi 缓存独立存在;
- ✅ 所有依赖变更必须反映在 Bundle 工程源码 + 构建产物(.jar) 中;
- ✅ 部署路径始终以 $LIFERAY_HOME/deploy/ 为准,而非 $CATALINA_BASE/webapps/;
- ✅ 使用 Liferay Control Panel → System Settings → OSGi → Installed Bundles 可实时查看 Bundle 状态、依赖树与导出包。
理解这一架构转变,是高效维护 Liferay 7+ 应用的前提。告别 WAR 思维,拥抱 OSGi Bundle 生命周期管理——这才是现代 Liferay 开发的正确起点。










