Drools 7.73.0.Final执行报错:org.eclipse.sisu.Parameters非绑定注解
Drools 7.73.0.Final 调用buildAll()时触发IllegalArgumentException
错误堆栈信息
java.lang.IllegalArgumentException: org.eclipse.sisu.Parameters is not a binding annotation. Please annotate it with @BindingAnnotation. at com.google.common.base.Preconditions.checkArgument(Preconditions.java:120) ~[na:na] at com.google.inject.Key.ensureIsBindingAnnotation(Key.java:402) ~[com.google.inject.guice-4.0.jar:na] at com.google.inject.Key.strategyFor(Key.java:389) ~[com.google.inject.guice-4.0.jar:na] at com.google.inject.Key.get(Key.java:251) ~[com.google.inject.guice-4.0.jar:na] at org.eclipse.sisu.wire.ParameterKeys.<clinit>(ParameterKeys.java:28) ~[na:na] at org.eclipse.sisu.wire.DependencyAnalyzer.<init>(DependencyAnalyzer.java:93) ~[na:na] at org.eclipse.sisu.wire.ElementAnalyzer.<init>(ElementAnalyzer.java:104) ~[na:na] at org.eclipse.sisu.wire.WireModule.configure(WireModule.java:74) ~[na:na] at com.google.inject.spi.Elements$RecordingBinder.install(Elements.java:340) ~[com.google.inject.guice-4.0.jar:na] at com.google.inject.spi.Elements.getElements(Elements.java:110) ~[com.google.inject.guice-4.0.jar:na] at com.google.inject.internal.InjectorShell$Builder.build(InjectorShell.java:138) ~[com.google.inject.guice-4.0.jar:na] at com.google.inject.internal.InternalInjectorCreator.build(InternalInjectorCreator.java:104) ~[com.google.inject.guice-4.0.jar:na] at com.google.inject.Guice.createInjector(Guice.java:96) ~[com.google.inject.guice-4.0.jar:na] at com.google.inject.Guice.createInjector(Guice.java:73) ~[com.google.inject.guice-4.0.jar:na] at com.google.inject.Guice.createInjector(Guice.java:62) ~[com.google.inject.guice-4.0.jar:na] at org.codehaus.plexus.DefaultPlexusContainer.addPlexusInjector(DefaultPlexusContainer.java:481) ~[na:na] at org.codehaus.plexus.DefaultPlexusContainer.<init>(DefaultPlexusContainer.java:206) ~[na:na] at org.codehaus.plexus.DefaultPlexusContainer.<init>(DefaultPlexusContainer.java:168) ~[na:na] at org.appformer.maven.integration.embedder.MavenEmbedderUtils.buildPlexusContainer(MavenEmbedderUtils.java:167) ~[na:na] at org.appformer.maven.integration.embedder.MavenEmbedderUtils.buildPlexusContainer(MavenEmbedderUtils.java:141) ~[na:na] at org.appformer.maven.integration.embedder.PlexusComponentProvider.<init>(PlexusComponentProvider.java:37) ~[na:na] at org.appformer.maven.integration.embedder.MavenEmbedderUtils.buildComponentProvider(MavenEmbedderUtils.java:57) ~[na:na] at org.appformer.maven.integration.embedder.MavenEmbedder.<init>(MavenEmbedder.java:91) ~[na:na] at org.appformer.maven.integration.embedder.MavenEmbedder.<init>(MavenEmbedder.java:85) ~[na:na] at org.appformer.maven.integration.embedder.MavenProjectLoader.newMavenEmbedder(MavenProjectLoader.java:148) ~[na:na] at org.appformer.maven.integration.embedder.MavenProjectLoader.parseMavenPom(MavenProjectLoader.java:90) ~[na:na] at org.appformer.maven.integration.embedder.MavenProjectLoader.parseMavenPom(MavenProjectLoader.java:84) ~[na:na] at org.appformer.maven.integration.MavenPomModelGenerator.parse(MavenPomModelGenerator.java:34) ~[na:na] at org.appformer.maven.support.PomModel$Parser.parse(PomModel.java:110) ~[na:na] at org.drools.compiler.kie.builder.impl.KieBuilderImpl.buildPomModel(KieBuilderImpl.java:594) ~[na:na] at org.drools.compiler.kie.builder.impl.KieBuilderImpl.init(KieBuilderImpl.java:152) ~[na:na] at org.drools.compiler.kie.builder.impl.KieBuilderImpl.buildAll(KieBuilderImpl.java:218) ~[na:na] at org.drools.compiler.kie.builder.impl.KieBuilderImpl.buildAll(KieBuilderImpl.java:192) ~[na:na]
触发场景
调用KieBuilder的buildAll()方法时触发,相关代码如下:
KieServices ks = KieServices.Factory.get(); KieRepository kr = ks.getRepository(); KieFileSystem kfs = ks.newKieFileSystem(); kfs.write(ResourceFactory.newFileResource(new File(drlPath))); KieBuilder kb = ks.newKieBuilder(kfs); kb.buildAll(); if (kb.getResults().hasMessages(Message.Level.ERROR)) throw new RuntimeException("Build Errors:\n" + kb.getResults().toString()); KieContainer kContainer = ks.newKieContainer(kr.getDefaultReleaseId()); KieSession kSession = kContainer.newKieSession();
问题原因
这是Guice版本与Eclipse Sisu版本不兼容导致的冲突:Guice 4.0要求所有绑定注解必须标注@BindingAnnotation,但旧版本的Eclipse Sisu的Parameters注解未满足该要求。Drools 7.73.0.Final依赖的组件中可能引入了冲突的Guice 4.0版本。
解决方案
1. 排除冲突的Guice依赖并引入兼容版本
在Maven或Gradle中排除Drools依赖带来的旧版Guice,替换为兼容的版本(如Guice 4.2.3):
Maven配置示例:
<!-- 排除drools-compiler中的冲突Guice --> <dependency> <groupId>org.drools</groupId> <artifactId>drools-compiler</artifactId> <version>7.73.0.Final</version> <exclusions> <exclusion> <groupId>com.google.inject</groupId> <artifactId>guice</artifactId> </exclusion> </exclusions> </dependency> <!-- 添加兼容的Guice版本 --> <dependency> <groupId>com.google.inject</groupId> <artifactId>guice</artifactId> <version>4.2.3</version> </dependency>
2. 检查并清理依赖冲突
执行依赖树分析命令,找出引入旧版Guice的其他依赖:
mvn dependency:tree
根据输出结果,对冲突的依赖进行排除操作,确保项目中只保留兼容的Guice版本。
3. 绕过Maven Pom解析(可选)
如果你的场景不需要Maven集成,可以尝试直接构建KieModule而不触发Pom模型解析,避免初始化Plexus容器:
KieServices ks = KieServices.Factory.get(); KieRepository kr = ks.getRepository(); KieFileSystem kfs = ks.newKieFileSystem(); kfs.write(ResourceFactory.newFileResource(new File(drlPath))); // 直接构建KieModule,不触发Pom解析 KieModule kieModule = ks.newKieBuilder(kfs).buildAll().getKieModule(); kr.addKieModule(kieModule); KieContainer kContainer = ks.newKieContainer(kieModule.getReleaseId()); KieSession kSession = kContainer.newKieSession();
内容的提问来源于stack exchange,提问作者rr0
相关产品推荐
相关产品推荐

