Simple Quarkus Kogito项目构建失败:依赖歧义与未满足依赖
解决Quarkus+Kogito+jBPM项目的依赖歧义构建错误
你遇到的是CDI依赖注入的经典歧义问题:项目里同时存在两组同名的核心类,让Quarkus的CDI容器无法确定该注入哪一个具体实现。具体冲突点是:
- 一组是Kogito框架自带的
org.kie.kogito.app.Application和org.kie.kogito.app.ApplicationConfig - 另一组是你项目自定义的
com.demo.poc.Application和com.demo.poc.ApplicationConfig
下面是三种可行的解决方案,按推荐程度排序:
方案1:重命名自定义类(最推荐)
最简单直接的方式是修改你自定义的类名,彻底避免和框架类名冲突:
- 把
com.demo.poc.Application改成com.demo.poc.DemoApplication - 把
com.demo.poc.ApplicationConfig改成com.demo.poc.DemoApplicationConfig
修改后同步更新所有引用这些类的代码,再执行mvn clean compile quarkus:dev,CDI容器就能清晰区分框架类和你的自定义类,歧义问题会直接消失。
方案2:用自定义限定符明确注入目标
如果不想修改类名,可以通过CDI限定符标记你的自定义Bean,告诉容器该选择哪一个实现:
- 新建一个自定义限定符注解:
@Qualifier @Target({TYPE, METHOD, PARAMETER, FIELD}) @Retention(RUNTIME) public @interface DemoApplication { }
- 在你的自定义
Application和ApplicationConfig类上添加这个限定符:
@ApplicationScoped @DemoApplication public class Application { // 你的现有业务代码 }
@ApplicationScoped @DemoApplication public class ApplicationConfig { // 你的现有配置代码 }
- 在需要注入的地方(比如
CreateFormProcessResource)指定使用这个限定符:
@Inject @DemoApplication private org.kie.kogito.Application application;
这样容器就会明确选择你标记了@DemoApplication的自定义Bean,不会再出现依赖歧义。
方案3:排除Kogito的默认Bean(适合完全替代框架实现的场景)
如果你的自定义类是要完全替换Kogito的默认Application和ApplicationConfig实现,可以在application.properties里添加配置,让Quarkus排除框架自带的这两个Bean:
quarkus.cdi.exclude.beans=org.kie.kogito.app.Application,org.kie.kogito.app.ApplicationConfig
配置生效后,容器只会加载你自定义的实现类,自然就不会有歧义问题了。
额外小提示
- 执行构建前先跑一遍
mvn clean,清理掉旧的生成代码,避免残留文件干扰构建。 - 检查项目中是否有Kogito自动生成的代码——Kogito有时候会根据流程定义生成
Application或Config类,要确保自定义类不会和这些生成类重名。
内容的提问来源于stack exchange,提问作者jccampos
相关产品推荐
相关产品推荐

