类加载器
arthas为了不污染目标JVM进程,自定义了自己的类加载器,并绑定了一些jar包
集成kafka时,碰到一个坑
直接在arthas-core模块的pom中引入kafka-client依赖:
<dependency>
<groupId>org.apache.kafka</groupId>
<artifactId>kafka-clients</artifactId>
<version>2.5.1</version>
</dependency>
kafka生产者如下初始化时:
使用watch命中后,触发发送kafka的代码,就会初始化kafka生产者,总是初始化失败产生如下异常信息:
java.lang.reflect.InvocationTargetException
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
at java.lang.reflect.Method.invoke(Unknown Source)
at com.taobao.arthas.agent334.AgentBootstrap.bind(AgentBootstrap.java:188)
at com.taobao.arthas.agent334.AgentBootstrap.access$000(AgentBootstrap.java:20)
at com.taobao.arthas.agent334.AgentBootstrap$1.run(AgentBootstrap.java:158)
Caused by: org.apache.kafka.common.config.ConfigException: \n
Invalid value org.apache.kafka.common.serialization.StringSerializer for configuration key.serializer: \n
Class org.apache.kafka.common.serialization.StringSerializer could not be found.
at org.apache.kafka.common.config.ConfigDef.parseType(ConfigDef.java:728)
at org.apache.kafka.common.config.ConfigDef.parseValue(ConfigDef.java:474)
at org.apache.kafka.common.config.ConfigDef.parse(ConfigDef.java:467)
at org.apache.kafka.common.config.AbstractConfig.<init>(AbstractConfig.java:108)
at org.apache.kafka.common.config.AbstractConfig.<init>(AbstractConfig.java:129)
at org.apache.kafka.clients.producer.ProducerConfig.<init>(ProducerConfig.java:481)
at org.apache.kafka.clients.producer.KafkaProducer.<init>(KafkaProducer.java:326)
at org.apache.kafka.clients.producer.KafkaProducer.<init>(KafkaProducer.java:298)
at com.taobao.arthas.core.kafka.KafkaProducerZdy.init(KafkaProducerZdy.java:18)
at com.taobao.arthas.core.kafka.KafkaProducerZdy.send(KafkaProducerZdy.java:39)
at com.taobao.arthas.core.server.ArthasBootstrap.<init>(ArthasBootstrap.java:137)
at com.taobao.arthas.core.server.ArthasBootstrap.getInstance(ArthasBootstrap.java:447)
at com.taobao.arthas.core.server.ArthasBootstrap.getInstance(ArthasBootstrap.java:435)
一看异常是StringSerializer没有找到,第一时间想到的是ArthasClassLoader的path中没有kafka-client.jar呗~~
但是仔细看日志,为毛异常堆栈能打印出来org.apache.kafka.clients.producer.KafkaProducer 这不是client包中的么,而且报错代码行也在client中。所以....不是因为kafka-client.jar没找到,而仅仅是StringSerializer没加载到。找到报错代码行如下图,如果序列化器通过字符串指定则会通过反射加载,反射之前获取的类加载器是AppClassLoader,此加载器是加载不到kafka-client.jar中的任何类的(因为只有ArthasClassLoader绑定了client.jar,ArthasClassLoader也不是AppClassLoader的父或者父父加载器)
改成如下方式即可解决问题