如何排除/移除第三方Jar包中引入的CDI扩展?
运行时排除第三方Jar包引入的CDI扩展
试试下面这些可行的方案,解决你之前用AlterableContext destroy和否决机制没搞定的问题:
1. 用CDI扩展SPI直接拦截扩展加载
自己写个Extension实现类,在容器扫描扩展的阶段直接把第三方的扩展否决掉:
public class ThirdPartyExtensionFilter implements Extension { public void processExtension(@Observes ProcessExtension<?> event) { String extClassName = event.getExtensionClass().getName(); // 替换成你要排除的第三方扩展全类名 if ("com.thirdparty.UnwantedExtension".equals(extClassName)) { event.veto(); } } }
写完之后,要把这个类的全类名加到META-INF/services/javax.enterprise.inject.spi.Extension文件里,CDI容器启动时才会加载这个过滤器。
2. 利用CDI容器的专属配置
不同容器有自己的配置项来排除扩展,举两个常用的例子:
- Weld容器:在
beans.xml里加<weld:exclude>标签指定要排除的类:
<beans xmlns="http://xmlns.jcp.org/xml/ns/javaee" xmlns:weld="http://jboss.org/schema/weld/beans" version="1.1"> <weld:exclude name="com.thirdparty.UnwantedExtension"/> </beans>
- OpenWebBeans容器:在
openwebbeans.properties里配置排除列表:
org.apache.webbeans.exclude.extensions=com.thirdparty.UnwantedExtension
3. 从类路径层面隔离
如果上面的方法都不太行,还可以通过构建工具把包含这个CDI扩展的模块从依赖里踢出去,注意别影响其他需要的功能:
- Maven:在依赖中添加排除规则:
<dependency> <groupId>com.thirdparty</groupId> <artifactId>problematic-jar</artifactId> <version>x.x.x</version> <exclusions> <exclusion> <groupId>com.thirdparty</groupId> <artifactId>extension-containing-module</artifactId> </exclusion> </exclusions> </dependency>
- Gradle:
implementation('com.thirdparty:problematic-jar:x.x.x') { exclude group: 'com.thirdparty', module: 'extension-containing-module' }
为啥你之前的方法没起效?
AlterableContext.destroy是用来销毁上下文中的Bean实例的,根本管不到扩展的加载流程,所以对移除扩展没用。- 你之前试的否决机制如果是针对普通Bean的,也不会影响扩展类——必须在
ProcessExtension这个特定阶段否决扩展类本身才会生效。
内容的提问来源于stack exchange,提问作者Stefan Rusen
相关产品推荐
相关产品推荐

