讲师中心 微信公众号
AI工具推荐 视频效率加速

Quarkus 多模块项目中依赖注入失败的常见原因与解决方案

秋静酱_1810

秋静酱_1810

发布时间:2026-02-11 21:23:29

|

870人浏览过

|

来源于php中文网

原创

Quarkus 多模块项目中依赖注入失败的常见原因与解决方案

quarkus 多模块项目中出现 “无法为非可代理 bean 类自动生成无参构造函数” 错误,根本原因在于子模块缺失 quarkus 构建插件配置,导致编译期元数据(如 jandex 索引、cdi 合成支持)未被正确生成。

在将单模块 Quarkus 应用拆分为多模块结构(如 base 和 dominio)后,开发者常误以为只需在父 POM 中声明 quarkus-maven-plugin 即可全局生效。然而,Quarkus 的构建生命周期高度依赖每个参与依赖注入的模块独立执行代码生成与元数据索引——尤其是 quarkus-maven-plugin:generate-code 和 jandex-maven-plugin(由 Quarkus 插件隐式触发)必须在每个含 CDI Bean 的子模块中运行,否则 Arc(Quarkus 的 CDI 实现)将无法识别或增强目标类。

错误提示:

It's not possible to automatically add a synthetic no-args constructor to an unproxyable bean class.
You need to manually add a non-private no-args constructor to com.gestorsistemas.chupacabra.base.invoicemirror.invoice.usecase.impl.NFCeSyncServiceImpl...

表面指向 NFCeSyncServiceImpl 缺少无参构造器,实则是 Arc 在编译期未能为其生成合成构造器,因为该类所在的 base 模块未执行 Quarkus 专属构建流程,导致其字节码未被 Jandex 索引、未被 Arc 注册为可代理 Bean。

Quark Lazy Cli
Quark Lazy Cli

基于夸克网盘自动转存项目 QAS 的懒人追剧、追番 SKILL,内置 CLI 工具。即使 QAS 订阅失效,仍可重新搜索资源、遍历多级目录,在多个最新候选中按用户偏好(如更高清晰度)转存新集和缺失集。可交由本地 OpenClaw、Hermes Agent 或其他 Claude 客户端使用。

下载

✅ 正确解决方案:为每个含 Bean 的子模块显式配置 Quarkus 构建插件

你无需修改任何 Java 代码(如手动添加无参构造器),也不需额外引入 jandex-maven-plugin 或 beans.xml——只需确保所有提供 CDI Bean 的子模块(如 base、dominio)的 pom.xml 中完整继承父 POM 的构建插件配置。

以 base/pom.xml 为例,应在 节点中补充如下配置(与父 POM 中一致):

<build>
  <plugins>
    <!-- Quarkus 核心构建插件(必需) -->
    <plugin>
      <groupId>${quarkus.platform.group-id}</groupId>
      <artifactId>quarkus-maven-plugin</artifactId>
      <version>${quarkus.platform.version}</version>
      <extensions>true</extensions>
      <executions>
        <execution>
          <goals>
            <goal>build</goal>
            <goal>generate-code</goal>
            <goal>generate-code-tests</goal>
          </goals>
        </execution>
      </executions>
    </plugin>

    <!-- 编译插件(启用 -parameters,支持注入参数名推断) -->
    <plugin>
      <groupId>org.apache.maven.plugins</groupId>
      <artifactId>maven-compiler-plugin</artifactId>
      <version>${compiler-plugin.version}</version>
      <configuration>
        <compilerArgs>
          <arg>-parameters</arg>
        </compilerArgs>
        <source>17</source>
        <target>17</target>
      </configuration>
    </plugin>

    <!-- 测试插件(确保测试类正确加载 LogManager) -->
    <plugin>
      <artifactId>maven-surefire-plugin</artifactId>
      <version>${surefire-plugin.version}</version>
      <configuration>
        <systemPropertyVariables>
          <java.util.logging.manager>org.jboss.logmanager.LogManager</java.util.logging.manager>
        </systemPropertyVariables>
      </configuration>
    </plugin>

    <!-- 集成测试插件(如使用 IT) -->
    <plugin>
      <artifactId>maven-failsafe-plugin</artifactId>
      <version>${surefire-plugin.version}</version>
      <executions>
        <execution>
          <goals>
            <goal>integration-test</goal>
            <goal>verify</goal>
          </goals>
        </execution>
      </executions>
    </plugin>
  </plugins>
</build>
? 关键说明:quarkus-maven-plugin 的 generate-code 目标会触发 Jandex 扫描、生成 META-INF/jandex.idx,并为 @ApplicationScoped 等作用域 Bean 注入合成无参构造器(即使你只定义了带参构造器)。这是 Arc 运行时代理和依赖注入的前提。

⚠️ 注意事项与最佳实践

  • 不要手动添加无参构造器:虽然添加 public NFCeSyncServiceImpl() {} 可绕过此错误,但这违背了构造器注入(Constructor Injection)的设计原则,且丧失了不可变性和测试友好性。
  • 避免 system 依赖污染构建环境:dominio/pom.xml 中使用 system 引入 sajdbc4.jar 属于反模式,建议改用本地 Maven 仓库部署或 maven-install-plugin,否则可能干扰类路径隔离与编译顺序。
  • 验证 Jandex 索引是否生成:构建成功后,检查 base/target/classes/META-INF/jandex.idx 是否存在。若缺失,则插件未生效。
  • 模块间依赖需明确作用域:dominio 依赖 base 时,应确保 base 模块已 mvn install 或启用 --also-make 构建,避免因依赖解析失败导致 Bean 不可见。
  • 统一版本管理:所有模块应严格继承父 POM 的 quarkus.platform.version 和插件版本,避免混合版本引发兼容性问题。

完成上述配置后,执行 mvn clean compile,Quarkus 将为 NFCeSyncServiceImpl 自动合成无参构造器,Arc 可正常创建代理实例,依赖注入恢复工作——整个过程零代码侵入,完全符合 Quarkus 的约定优于配置理念。

热门AI工具

更多
豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

讯飞绘文

讯飞绘文是一款由科大讯飞推出的一站式 AIGC 内容运营平台。

Laper
Laper Hot

Laper是专为编剧、导演和制片人推出的 AI 原生剧本创作工具。

DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

UpDream
UpDream Hot

一款AI视频创作工具,主要用于哔哩哔哩推出的自研AI视频创作工具,适合需要提升相关任务效率的用户。

蛙蛙写作

一款AI论文写作工具,主要用于超级AI智能写作助手,适合需要提升相关任务效率的用户。

火山引擎

火山引擎是一款面向企业的云计算与AI服务平台。

小橡皮AI

一款AI工具,主要用于小橡皮一键去AI味,将机器味重的内容改得更有活人感,防止因为 AI 内容被平台打上 AI 标签,以及限流,适合需要提升相关任务效率的用户。

相关专题

更多
Java Maven专题
Java Maven专题

本专题聚焦 Java 主流构建工具 Maven 的学习与应用,系统讲解项目结构、依赖管理、插件使用、生命周期与多模块项目配置。通过企业管理系统、Web 应用与微服务项目实战,帮助学员全面掌握 Maven 在 Java 项目构建与团队协作中的核心技能。

4040

2025.09.15

Java Maven/Gradle 构建与依赖管理合集
Java Maven/Gradle 构建与依赖管理合集

系统讲解 Java 项目构建工具的使用与进阶配置,涵盖 Maven 的 POM 文件结构、生命周期(clean/compile/package/install/deploy)与插件机制、依赖范围(compile/provided/test/runtime)与传递依赖管理、多模块聚合与继承、私有 Nexus 仓库发布,以及 Gradle 的 Groovy / Kotlin DSL 语法、Task 自定义与增量构建、依赖版本目录(Versi

369

2026.05.09

pdf怎么转换成xml格式
pdf怎么转换成xml格式

将 pdf 转换为 xml 的方法:1. 使用在线转换器;2. 使用桌面软件(如 adobe acrobat、itext);3. 使用命令行工具(如 pdftoxml)。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

4704

2024.04.01

xml怎么变成word
xml怎么变成word

步骤:1. 导入 xml 文件;2. 选择 xml 结构;3. 映射 xml 元素到 word 元素;4. 生成 word 文档。提示:确保 xml 文件结构良好,并预览 word 文档以验证转换是否成功。想了解更多xml的相关内容,可以阅读本专题下面的文章。

6117

2024.08.01

xml是什么格式的文件
xml是什么格式的文件

xml是一种纯文本格式的文件。xml指的是可扩展标记语言,标准通用标记语言的子集,是一种用于标记电子文件使其具有结构性的标记语言。想了解更多相关的内容,可阅读本专题下面的相关文章。

2502

2024.11.28

Gradle插件开发入门教程
Gradle插件开发入门教程

本专题介绍Gradle插件开发的基本流程,涵盖插件类编写、自定义任务注册、扩展参数设计和插件应用方法,帮助你理解插件如何组织构建逻辑,减少多个项目之间的重复配置。

60

2026.10.22

Gradle Wrapper配置教程
Gradle Wrapper配置教程

本专题介绍Gradle Wrapper的基本作用,涵盖文件组成、生成方法、版本配置和任务调用,帮助你理解项目如何使用指定的Gradle版本,减少不同开发环境带来的构建差异。

40

2026.10.22

Golangci-lint检查器使用教程
Golangci-lint检查器使用教程

本专题整理Golangci-lint常用Linters的用途与配置方法,覆盖错误处理、无效代码、安全、复杂度、命名和依赖检查,帮助项目合理选规则。

40

2026.10.22

Gradle怎么构建Java项目
Gradle怎么构建Java项目

本专题介绍Gradle Java项目构建方法,涵盖Java插件配置、依赖声明、源码编译、测试执行和打包检查,帮助你理解各阶段的任务关系,逐步完成项目构建。

20

2026.10.22

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
热门推荐
/
最新课程
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn