Drools 8在OSGi环境运行遇阻求解决方案:已引入drools-mvel仍报错
解决Drools 8在Apache Karaf环境中无法加载MVEL方言的问题
已知Drools 8官方已移除OSGi原生支持,升级到8.44.0Final后,即便部署了drools-mvel bundle并启用Apache Aries SPI Fly,仍会出现Unable to load Dialect 'mvel'错误。以下是可行的解决方案:
方案1:调整OSGi类加载与SPI配置
- 给
drools-compilerbundle添加动态导入,确保能访问drools-mvel中的方言实现类:
在bundle的MANIFEST.MF中添加:DynamicImport-Package: org.drools.mvel.compiler.*, org.drools.mvel.runtime.* - 配置Karaf系统属性,强制指定SPI提供者bundle:
在etc/system.properties中添加:
该属性让Aries SPI Fly明确从aries.spi.provider.bundles=drools-mveldrools-mvelbundle中加载SPI服务实现。
方案2:手动注册MVEL方言
绕过ServiceLoader的OSGi类加载限制,在应用初始化时手动注册MVEL方言:
import org.drools.compiler.rule.builder.dialect.DialectRegistry; import org.drools.mvel.compiler.MvelDialect; import org.drools.mvel.compiler.MvelDialectConfiguration; // 在应用启动的BundleActivator或初始化类中执行 DialectRegistry.getInstance().registerDialect("mvel", new MvelDialect(), MvelDialectConfiguration::new);
此方法直接将方言实现注入到Drools的注册表中,无需依赖SPI自动发现。
方案3:采用嵌入依赖的Bundle打包方式
如果允许修改bundle打包策略,将Drools相关依赖(包括drools-core、drools-compiler、drools-mvel)嵌入到应用bundle中:
- 在maven-bundle-plugin的配置中添加:
这种方式让Drools类在同一个类加载器中运行,避免OSGi的类隔离问题。<plugin> <groupId>org.apache.felix</groupId> <artifactId>maven-bundle-plugin</artifactId> <configuration> <Embed-Dependency>drools-core, drools-compiler, drools-mvel;scope=compile|runtime</Embed-Dependency> <Embed-Transitive>true</Embed-Transitive> <Export-Package>你的应用包路径</Export-Package> <Import-Package>*</Import-Package> </configuration> </plugin>
错误信息参考:
java.lang.RuntimeException: Unable to load Dialect 'mvel'. Please add drools-mvel among your dependencies at org.drools.compiler.rule.builder.PackageBuildContext.initContext(PackageBuildContext.java:99) at org.drools.compiler.rule.builder.RuleBuildContext.<init>(RuleBuildContext.java:83) at org.drools.compiler.builder.impl.processors.ImmutableRuleCompilationPhase.buildRuleBuilderContext(ImmutableRuleCompilationPhase.java:259) at org.drools.compiler.builder.impl.processors.ImmutableRuleCompilationPhase.compileRulesLevel(ImmutableRuleCompilationPhase.java:297) at org.drools.compiler.builder.impl.processors.ImmutableRuleCompilationPhase.process(ImmutableRuleCompilationPhase.java:82) at java.base/java.util.Arrays$ArrayList.forEach(Arrays.java:4204) at org.drools.compiler.builder.impl.KnowledgeBuilderImpl.compileKnowledgePackages(KnowledgeBuilderImpl.java:461) at org.drools.compiler.builder.impl.KnowledgeBuilderImpl.buildRules(KnowledgeBuilderImpl.java:1020) at org.drools.compiler.builder.impl.KnowledgeBuilderImpl.doFirstBuildStep(KnowledgeBuilderImpl.java:994) at org.drools.compiler.builder.impl.CompositeKnowledgeBuilderImpl.build(CompositeKnowledgeBuilderImpl.java:114) at org.drools.compiler.builder.impl.CompositeKnowledgeBuilderImpl.build(CompositeKnowledgeBuilderImpl.java:104) at org.drools.compiler.kie.builder.impl.AbstractKieProject.buildKnowledgePackages(AbstractKieProject.java:270) at org.drools.compiler.kie.builder.impl.AbstractKieProject.buildKnowledgePackages(AbstractKieProject.java:216) at org.drools.compiler.kie.builder.impl.AbstractKieProject.verify(AbstractKieProject.java:80) at org.drools.compiler.kie.builder.impl.KieBuilderImpl.buildKieProject(KieBuilderImpl.java:282) at org.drools.compiler.kie.builder.impl.KieBuilderImpl.buildAll(KieBuilderImpl.java:248) at org.drools.compiler.kie.builder.impl.KieBuilderImpl.buildAll(KieBuilderImpl.java:195)
内容的提问来源于stack exchange,提问作者Steven Huypens
相关产品推荐
相关产品推荐

