Gradle 构建 Quarkus 跨模块依赖注入(Inject)失败

发表于 2023-03-03

问题描述

当我使用 Gradle 重新构建原来的 Maven 项目时。遇到了异常:

Unsatisfied dependency for type LibraryBean and qualifiers [@Default]
- java member: ServiceImpl#bean
- declared on CLASS bean [types=[ServiceImpl, java.lang.Object], qualifiers=[@Default, @Any], target=ServiceImpl]

在发现注入失败时,检查了我的项目依赖,都是正常的,也能正常导入依赖模块的 Bean,但是在运行时始终诸如不了。

尝试注释所有异常的 Java Bean 声明,这时候正常启动,但是检测 Arc 容器内的 Bean,缺失了模块内的 Bean。

初步判定 Quarkus 在 Gradle 环境下构建,使用 Quarkus.run(...) 启动时 CDI 失败了。

项目结构

├── rootProject
│   ├── module-library
│   ├── module-service (需要依赖并注入 module-library 模块中的 Bean)

项目的 settings.gradle

pluginManagement {
    repositories {
        mavenCentral()
        gradlePluginPortal()
        mavenLocal()
    }
    plugins {
        id "${quarkusPluginId}" version "${quarkusPluginVersion}"
    }
}
rootProject.name='rootProject'
include ':module-library'
include ':module-service'

服务(module-service)模块的 build.gradle

dependencies {
   implementation project(":module-library")
}

库(module-library)模块声明 Bean

@ApplicationScoped
public class LibraryBean {

    public void doSomething() {
        System.out.println("Hello");
    }
}

服务(module-service)模块注入 Bean

/////////////////// 启动方式 ///////////////////
@QuarkusMain
public class ServiceMain {
    public static void main(String... args) {
        Quarkus.run(args);
    }
}
/////////////////// 注入 Bean ///////////////////
@ApplicationScoped
public class ServiceImpl {
    @Inject
    LibraryBean bean;
}

解决方法

几经周转在 stack overflow 上找到了答案

其中提到的解决方案

  • 使用 Gradle 插件 Jandex。
  • resources 目录下声明空的 beans.xml 文件,相对路径为 src/main/resources/META-INF/beans.xml