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

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-compiler bundle添加动态导入,确保能访问drools-mvel中的方言实现类:
    在bundle的MANIFEST.MF中添加:
    DynamicImport-Package: org.drools.mvel.compiler.*, org.drools.mvel.runtime.*
    
  • 配置Karaf系统属性,强制指定SPI提供者bundle:
    在etc/system.properties中添加:
    aries.spi.provider.bundles=drools-mvel
    
    该属性让Aries SPI Fly明确从drools-mvel bundle中加载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的配置中添加:
    <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>
    
    这种方式让Drools类在同一个类加载器中运行,避免OSGi的类隔离问题。

错误信息参考:

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.28 02:20:38