在使用javaagent
实现微服务间调用关系时,难点之一就是类加载问题:不同的classLoader
(类加载器)加载父子class类时所产生的问题,如
- 问题场景1、
ClassNotFoundException问题
- 问题场景2、
NoClassDefFoundError问题
- 问题场景3、
java.lang.IllegalAccessError: tried to access field x.xx.XXX from class x.yy.ZZZ
问题
本质都是class loader加载class的问题
通过本文可以获得以下答案
AppClassLoader
的classpath
指的是什么IllegalAccessError: tried to access field
的原因
这篇文章通过实例详细分析下问题3场景,即 tried to access field x.xx.XXX from class x.yy.ZZZ
问题的根本原因,以及原因的原因。
本文力求简单,所以只专注一个点,其他不做扩展
问题现场
这里我们有两个jar包,一个是xx-agent.jar
,一个是yy-app.jar
。我们使用slf4j jar
演示问题,所以,我们的两个jar都要依赖org.slf4j
包
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>1.7.25</version>
</dependency>
当xx-agent.jar
与 yy-app.jar
通过maven package
后,结构如下
-
xx-agent.jar结构,关注点已经被圈中
-
yy-app.jar结构