如何编译含注册Hook的Liferay OSGi Bundle并整合配置功能
将Liferay Hook与可配置OSGi Bundle整合的解决方案
可以将Servlet Filter类型的Hook与可配置应用打包为单个OSGi Bundle(WAB),以下是两种可行方案:
方案一:通过WAB配置整合liferay-hook.xml
如果坚持使用传统Hook配置文件,需调整项目结构和Maven插件配置:
调整文件位置
将liferay-hook.xml从webapp/WEB-INF移至src/main/resources/META-INF目录。配置maven-bundle-plugin
在pom.xml中添加以下插件配置,确保Bundle被识别为Liferay WAB并包含Hook配置:<plugin> <groupId>org.apache.felix</groupId> <artifactId>maven-bundle-plugin</artifactId> <version>5.1.9</version> <extensions>true</extensions> <configuration> <instructions> <Liferay-WAB>true</Liferay-WAB> <Include-Resource> src/main/resources/META-INF/liferay-hook.xml, {maven-resources} </Include-Resource> <Import-Package> javax.servlet.*, com.liferay.portal.kernel.servlet.*, * </Import-Package> <Bundle-SymbolicName>com.yourcompany.log.app</Bundle-SymbolicName> <Bundle-Version>1.0.0</Bundle-Version> </instructions> </configuration> </plugin>
方案二:OSGi原生注解注册Filter(推荐)
Liferay 7.x更推荐使用OSGi组件模型注册Servlet Filter,无需依赖liferay-hook.xml,直接在Filter类上添加注解即可,完美整合到你的可配置Bundle中:
import com.liferay.portal.kernel.servlet.BaseFilter; import org.osgi.service.component.annotations.Component; import javax.servlet.Filter; import javax.servlet.FilterChain; import javax.servlet.ServletException; import javax.servlet.ServletRequest; import javax.servlet.ServletResponse; import java.io.IOException; @Component( immediate = true, property = { "servlet-filter-name=My Hook", "url-pattern=/*", "before-filter=SSO Open SSO Filter" }, service = Filter.class ) public class MyHook extends BaseFilter { @Override protected void processFilter( ServletRequest request, ServletResponse response, FilterChain filterChain ) throws IOException, ServletException { // 实现你的日志逻辑 filterChain.doFilter(request, response); } }
验证部署
- 执行
mvn clean install编译Bundle - 将JAR包放入Liferay的
osgi/modules目录 - 通过Gogo Shell执行
lb | grep "你的Bundle名称"确认Bundle处于Active状态 - 查看Liferay日志验证Filter是否生效
内容的提问来源于stack exchange,提问作者Dalimil Rozprým
相关产品推荐
相关产品推荐

