Tomcat环境Jackson版本冲突致RuntimeException及Shading依赖问题求助
问题:Tomcat环境Jackson版本冲突引发NoClassDefFoundError,Shading后插件无法引用重命名类
背景
我开发的Java插件运行在厂商基于Tomcat的应用服务器上,厂商代码不可修改,仅能通过其框架扩展接口实现自定义功能。厂商将Java版本从11升级至17后,插件出现功能回归问题。
我们已确保Maven pom.xml指定Java 17为目标版本,且所有fasterxml.jackson依赖版本统一为2.13.2:
<dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-core</artifactId> <version>2.13.2</version> </dependency> <dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-annotations</artifactId> <version>2.13.2</version> </dependency> <dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-databind</artifactId> <version>2.13.2</version> </dependency> <dependency> <groupId>com.fasterxml.jackson.module</groupId> <artifactId>jackson-module-jaxb-annotations</artifactId> <version>2.13.2</version> </dependency>
问题排查与报错信息
排查发现厂商Tomcat的lib目录存在2.9.8版本的Jackson旧库,该版本无TokenStreamFactory类,但无法修改厂商代码。当前报错信息如下:
ERROR: RuntimeException encountered attempting to send message. java.lang.RuntimeException: org.apache.kafka.common.KafkaException: Failed to construct kafka producerException in thread "ordermessageadapter" java.lang.RuntimeException: org.apache.kafka.common.KafkaException: Failed to construct kafka producer at com.vendor.xyz.conn.kafka.KafkaTopicSenderFactory.createAdapter(KafkaTopicSenderFactory.java:39) at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77) at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.base/java.lang.reflect.Method.invoke(Method.java:568) at com.vendor.plugin.APIInvocationHandler.invoke(APIInvocationHandler.java:62) at jdk.proxy4/jdk.proxy4.$Proxy166.createAdapter(Unknown Source) at com.vendor.messageadapter.EndPoint$MySenderBufferThread.run(EndPoint.java:134) Caused by: org.apache.kafka.common.KafkaException: Failed to construct kafka producer at org.apache.kafka.clients.producer.KafkaProducer.<init>(KafkaProducer.java:442) at org.apache.kafka.clients.producer.KafkaProducer.<init>(KafkaProducer.java:292) at org.apache.kafka.clients.producer.KafkaProducer.<init>(KafkaProducer.java:319) at org.apache.kafka.clients.producer.KafkaProducer.<init>(KafkaProducer.java:304) at com.xyz.connection.manager.KafkaBuilder.producerCreation(KafkaBuilder.java:56) at com.xyz.connection.manager.KafkaBuilder.connect(KafkaBuilder.java:52) at com.vendor.xyz.conn.kafka.KafkaTopicSenderAdapter.<init>(KafkaTopicSenderAdapter.java:49) at com.vendor.xyz.conn.kafka.KafkaTopicSenderFactory.createAdapter(KafkaTopicSenderFactory.java:36) ... 7 more Caused by: java.lang.NoClassDefFoundError: Could not initialize class io.confluent.kafka.schemaregistry.client.rest.RestService at io.confluent.kafka.schemaregistry.client.CachedSchemaRegistryClient.<init>(CachedSchemaRegistryClient.java:157) at io.confluent.kafka.serializers.AbstractKafkaSchemaSerDe.configureClientProperties(AbstractKafkaSchemaSerDe.java:83) at io.confluent.kafka.serializers.AbstractKafkaAvroSerializer.configure(AbstractKafkaAvroSerializer.java:56) at io.confluent.kafka.serializers.KafkaAvroSerializer.configure(KafkaAvroSerializer.java:50) at org.apache.kafka.clients.producer.KafkaProducer.<init>(KafkaProducer.java:378) ... 14 more Caused by: java.lang.ExceptionInInitializerError: Exception java.lang.VerifyError: Bad return type Exception Details: Location: com/fasterxml/jackson/databind/cfg/MapperBuilder.streamFactory()Lcom/fasterxml/jackson/core/TokenStreamFactory; @7: areturn Reason: Type 'com/fasterxml/jackson/core/JsonFactory' (current frame, stack[0]) is not assignable to 'com/fasterxml/jackson/core/TokenStreamFactory' (from method signature) Current Frame: bci: @7 flags: { } locals: { 'com/fasterxml/jackson/databind/cfg/MapperBuilder' } stack: { 'com/fasterxml/jackson/core/JsonFactory' } Bytecode: 0000000: 2ab4 0002 b600 08b0 [in thread "MyCode"] at com.fasterxml.jackson.databind.json.JsonMapper.builder(JsonMapper.java:114) at io.confluent.kafka.schemaregistry.utils.JacksonMapper.<clinit>(JacksonMapper.java:27) at io.confluent.kafka.schemaregistry.client.rest.RestService.<clinit>(RestService.java:155) ... 19 more
尝试方案与待解决问题
推测是旧版本Jackson干扰所致,尝试通过Shading将Jackson 2.13.2打包至common.jar,并将包路径重命名为my.shaded.com.fasterxml.jackson。但依赖该包的XYZ插件无法引用重命名后的类(如my.shaded.com.fasterxml.jackson.annotation.JsonIgnoreProperties),寻求解决该依赖引用问题的方法。
内容的提问来源于stack exchange,提问作者firstblud
相关产品推荐
相关产品推荐

