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

Quarkus多模块项目SLF4J版本冲突与多绑定问题求助

Quarkus多模块Maven项目SLF4J冲突问题排查与解决

问题描述

开发基于Maven的多模块Quarkus项目,引入kotlin-main-kts库后出现以下异常:

  • SLF4J多绑定警告
  • 版本不兼容导致项目无法启动
  • 本地运行正常,但Docker打包后启动失败
  • 核心报错信息:
    The requested version 2.0.6 by your slf4j binding is not compatible with [1.6, 1.7]
    
  • 最终因方法缺失崩溃:
    java.lang.NoSuchMethodError: 'org.slf4j.helpers.FormattingTuple org.slf4j.helpers.MessageFormatter.format(java.lang.String, java.lang.Object)'
    
  • 堆栈显示存在两个SLF4J绑定:
    • org.jboss.slf4j.slf4j-jboss-logmanager-2.0.0.Final.jar(Quarkus主pom的对等依赖)
    • org.jetbrains.kotlin.kotlin-main-kts-1.9.10.jar(子模块直接依赖)

依赖排查情况

执行mvn dependency:tree -Dincludes=*slf4j*查看依赖树,kotlin-main-kts未显示SLF4J相关依赖,但jboss-logmanager正常输出:

[INFO] com.my.package:produit:jar:1.0.12-SNAPSHOT
[INFO] +- io.quarkus:quarkus-rest-client:jar:3.4.3:compile
[INFO] |  \- io.quarkus:quarkus-core:jar:3.4.3:compile
[INFO] |     \- org.jboss.slf4j:slf4j-jboss-logmanager:jar:2.0.0.Final:compile
[INFO] \- io.mockk:mockk-jvm:jar:1.13.4:test
[INFO]    \- org.slf4j:slf4j-api:jar:2.0.6:compile

已尝试的无效方案

  • 配置dependencyManagement统一SLF4J版本
  • 在kotlin-main-kts依赖中排除SLF4J相关模块
  • 调整pom中的依赖顺序

核心原因分析

kotlin-main-kts采用特殊的依赖引入方式,将SLF4J绑定直接打包在自身jar包内,导致Maven依赖树无法检测到该隐藏依赖。这使得Quarkus默认的slf4j-jboss-logmanager(依赖SLF4J API 2.x)与kotlin-main-kts内置的旧版SLF4J绑定(仅支持1.6/1.7版本API)发生冲突,引发版本不兼容和方法缺失错误。

解决方法建议

1. 过滤kotlin-main-kts中的SLF4J绑定类

在子模块pom.xml中配置Maven依赖插件,解压并过滤kotlin-main-kts的jar包,移除其中的SLF4J绑定类:

<build>
  <plugins>
    <plugin>
      <groupId>org.apache.maven.plugins</groupId>
      <artifactId>maven-dependency-plugin</artifactId>
      <executions>
        <execution>
          <id>unpack-kotlin-main-kts</id>
          <phase>process-resources</phase>
          <goals>
            <goal>unpack</goal>
          </goals>
          <configuration>
            <artifactItems>
              <artifactItem>
                <groupId>org.jetbrains.kotlin</groupId>
                <artifactId>kotlin-main-kts</artifactId>
                <version>1.9.10</version>
                <outputDirectory>${project.build.directory}/filtered-libs</outputDirectory>
                <excludes>
                  <exclude>org/slf4j/impl/**</exclude>
                </excludes>
              </artifactItem>
            </artifactItems>
          </configuration>
        </execution>
      </executions>
    </plugin>
    <!-- 将过滤后的文件打包进项目jar -->
    <plugin>
      <groupId>org.apache.maven.plugins</groupId>
      <artifactId>maven-jar-plugin</artifactId>
      <configuration>
        <resources>
          <resource>
            <directory>${project.build.directory}/filtered-libs</directory>
            <includes>
              <include>**/*</include>
            </includes>
          </resource>
        </resources>
      </configuration>
    </plugin>
  </plugins>
</build>

2. 升级kotlin-main-kts版本

检查kotlin-main-kts的新版本是否已修复内置SLF4J绑定的问题,优先选用与Quarkus SLF4J版本兼容的版本。

3. Docker构建时手动移除冲突类

在Dockerfile中添加步骤,直接修改kotlin-main-kts.jar,删除其中的SLF4J绑定类:

# 假设Quarkus应用的lib目录为/home/jboss/lib/main
RUN zip -d /home/jboss/lib/main/org.jetbrains.kotlin.kotlin-main-kts-1.9.10.jar org/slf4j/impl/*

4. 强制Quarkus使用指定日志绑定

在application.properties中配置Quarkus强制使用slf4j-jboss-logmanager:

quarkus.log.handler.default=jboss-logmanager
quarkus.log.slf4j.binding=org.jboss.slf4j:slf4j-jboss-logmanager

内容的提问来源于stack exchange,提问作者Quentin Lerebours

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.07 10:34:51