由于命名空间与“jakarta”/“javax”冲突,无法使用 Spring Boot 3.0 运行logstash

问题描述 投票:0回答:1

我们正在升级到 Spring Boot 3.x,在运行时我们遇到了这个异常: “类未找到异常”:javax.xml.bind.annotation.XmlElement

java.lang.NoClassDefFoundError: javax/xml/bind/annotation/XmlElement
    at com.fasterxml.jackson.module.jaxb.JaxbAnnotationIntrospector.<init>(JaxbAnnotationIntrospector.java:137)
    at com.fasterxml.jackson.module.jaxb.JaxbAnnotationIntrospector.<init>(JaxbAnnotationIntrospector.java:124)
    at com.fasterxml.jackson.module.jaxb.JaxbAnnotationModule.setupModule(JaxbAnnotationModule.java:98)
    at com.fasterxml.jackson.databind.ObjectMapper.registerModule(ObjectMapper.java:879)
    at com.fasterxml.jackson.databind.ObjectMapper.registerModules(ObjectMapper.java:1081)
    at com.fasterxml.jackson.databind.ObjectMapper.findAndRegisterModules(ObjectMapper.java:1165)
    at net.logstash.logback.composite.AbstractCompositeJsonFormatter.createJsonFactory(AbstractCompositeJsonFormatter.java:247)
    at net.logstash.logback.composite.AbstractCompositeJsonFormatter.start(AbstractCompositeJsonFormatter.java:117)
    at net.logstash.logback.LogstashFormatter.start(LogstashFormatter.java:144)
    at net.logstash.logback.encoder.CompositeJsonEncoder.start(CompositeJsonEncoder.java:129)

仔细检查后,这似乎是由 logstash 引起的,这是一个与弹性搜索一起使用的日志框架。

logstash 的当前版本是 6.4.x,因此我们将其提升到 7.4.x(使用 Gradle:implementation("net.logstash.logback:logstash-logback-encoder:7.4")),但是我们还是有同样的问题。

原因是间接使用xml绑定存在依赖关系(https://mvnrepository.com/artifact/net.logstash.logback/logstash-logback-encoder/7.4)问题是存在对logback的依赖(称为 logback-classic)使用 XML 绑定。经过一番研究并访问这个网站:https://logback.qos.ch/news.html,我们意识到有两个版本的 logback classic 使用不同的命名空间。

logback-classic 1.3.x -> uses javax namespace 
logback-classic 1.4.x -> uses jakarta namespace

我的理解是我们需要将 logback-classic 更新到 1.4,因为该版本使用与 SpringBoot 3.x xml 绑定兼容的 jakarta 命名空间。

因此,我们在 gradle 构建中明确将 logback-classic 设置为 1.4,如下所示:

implementation("ch.qos.logback:logback-classic:1.4.14")
implementation("net.logstash.logback:logstash-logback-encoder:7.4")

但是现在当我们运行它时,我们得到了一个不同的错误:

Exception in thread "main" java.lang.NoSuchMethodError: 'java.lang.ClassLoader ch.qos.logback.core.util.Loader.systemClassloaderIfNull(java.lang.ClassLoader)'
    at ch.qos.logback.classic.util.ContextInitializer.autoConfig(ContextInitializer.java:73)
    at ch.qos.logback.classic.util.ContextInitializer.autoConfig(ContextInitializer.java:66)
    at ch.qos.logback.classic.spi.LogbackServiceProvider.initializeLoggerContext(LogbackServiceProvider.java:52)
    at ch.qos.logback.classic.spi.LogbackServiceProvider.initialize(LogbackServiceProvider.java:41)
    at org.slf4j.LoggerFactory.bind(LoggerFactory.java:183)
    at org.slf4j.LoggerFactory.performInitialization(LoggerFactory.java:170)
    at org.slf4j.LoggerFactory.getProvider(LoggerFactory.java:455)
    at org.slf4j.LoggerFactory.getILoggerFactory(LoggerFactory.java:441)
    at org.slf4j.LoggerFactory.getLogger(LoggerFactory.java:390)
spring-boot logstash logback
1个回答
0
投票

对我来说,似乎存在版本差异。我在logstash-logback-encoder README的官方文档中找到了这个。

https://github.com/logfellow/logstash-logback-encoder

If you get ClassNotFoundException/NoClassDefFoundError/NoSuchMethodError at runtime, then ensure the required dependencies (and appropriate versions) as specified in the pom file from the maven repository exist on the runtime classpath. Specifically, the following need to be available on the runtime classpath:

jackson-databind / jackson-core / jackson-annotations >= 2.12.0
logback-core >= 1.3.0
logback-classic >= 1.3.0 (required for logging LoggingEvents)
logback-access >= 1.3.0 (required for logging AccessEvents)
slf4j-api (usually comes as a transitive dependency of logback-classic)
java-uuid-generator (required if the uuid provider is used) 
© www.soinside.com 2019 - 2024. All rights reserved.