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运行环境提供,不需要打包到你的模块里,只在编译时用就行,避免重复打包和冲突。
验证步骤
- 先清理之前的构建产物:
mvn clean(Maven)或者gradle clean(Gradle) - 重新构建模块:
mvn install或者gradle build - 把新生成的jar包重新部署到Liferay
- 查看日志,应该就不会再出现
ClassNotFoundException的报错了
额外提醒
Liferay 7+完全基于OSGi,每个模块都是独立的bundle,和传统的WAR包不一样——所有外部依赖都必须显式声明,不管是通过bnd文件还是Maven/Gradle的依赖配置。别指望编译过了运行就没问题,OSGi的依赖管理可是很严格的哦!
内容的提问来源于stack exchange,提问作者Nicolas Raoul
相关产品推荐
相关产品推荐

