You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Liferay 7自定义Filter模块部署报ClassNotFoundException问题求助

解决Liferay 7模块部署时的ClassNotFoundException: com.liferay.portal.kernel.servlet.BaseFilter问题

嘿,这个问题我太熟了——你踩了Liferay 7 OSGi模块最常见的依赖声明坑之一!

问题根源

你的模块编译正常但部署报错,核心原因是你的模块没有在OSGi配置里显式声明对com.liferay.portal.kernel包的依赖。编译时本地构建环境能找到BaseFilter类,但到了Liferay的OSGi运行时,每个模块都是独立的bundle,框架不会自动帮你发现未声明的外部依赖,所以就找不到这个类了。

具体解决方案

根据你的构建工具,选下面对应的方法来修复:

如果你用bnd.bnd配置模块

在模块根目录的bnd.bnd文件里,添加或更新Import-Package声明:

Import-Package: com.liferay.portal.kernel.servlet,\
 *
  • 第一行显式导入BaseFilter所在的包,告诉OSGi框架这个模块需要它
  • 第二行的*是通配符,用来导入模块需要的其他所有依赖包,保证编译和运行时的依赖完整性

如果你用Maven构建模块

直接在pom.xml的<dependencies>节点里添加这个依赖:

<dependency>
    <groupId>com.liferay.portal</groupId>
    <artifactId>com.liferay.portal.kernel</artifactId>
    <version>${liferay.version}</version>
    <scope>provided</scope>
</dependency>
  • 一定要加上<scope>provided</scope>!这个标记告诉Maven:这个jar由Liferay运行环境提供,不需要打包到你的模块里,只在编译时用就行,避免重复打包和冲突。

验证步骤

  1. 先清理之前的构建产物:mvn clean(Maven)或者gradle clean(Gradle)
  2. 重新构建模块:mvn install或者gradle build
  3. 把新生成的jar包重新部署到Liferay
  4. 查看日志,应该就不会再出现ClassNotFoundException的报错了

额外提醒

Liferay 7+完全基于OSGi,每个模块都是独立的bundle,和传统的WAR包不一样——所有外部依赖都必须显式声明,不管是通过bnd文件还是Maven/Gradle的依赖配置。别指望编译过了运行就没问题,OSGi的依赖管理可是很严格的哦!

内容的提问来源于stack exchange,提问作者Nicolas Raoul

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 06:12:28