Anypoint Studio类加载器释放警告问题的排查与解决
最近我在用Anypoint Studio 6.6.5(构建ID:202005271503)基于Mule 3.8.4开发Maven化项目时,控制台一直弹出烦人的警告:There were problems disposing the mule classloader,对应的异常堆栈是:
java.lang.IllegalAccessError: tried to access class org.apache.commons.logging.LogFactory$6 from class org.apache.commons.logging.LogFactory at org.apache.commons.logging.LogFactory.getSystemProperty(LogFactory.java:1442)
虽然这个警告不会影响应用运行,但查了不少资料后终于搞懂了成因和解决办法,分享给大家:
问题成因
这个警告的核心是Commons Logging的版本冲突。Mule Runtime或者Anypoint Studio本身自带了某个版本的Commons Logging,而项目依赖中可能引入了不同版本的该库,或者依赖传递带来了版本不一致。当Mule类加载器销毁时,不同版本的LogFactory类试图访问其内部包私有类LogFactory$6,就会触发IllegalAccessError——因为包私有类只能被同一包内同一版本的类访问,版本差异导致了访问权限问题。
解决办法
在项目的pom.xml中显式添加指定版本的Commons Logging依赖,强制Maven使用这个版本来统一依赖:
<dependency> <groupId>commons-logging</groupId> <artifactId>commons-logging</artifactId> <version>1.1.1</version> </dependency>
添加后,Maven的依赖仲裁机制会优先选用我们声明的1.1.1版本,消除版本不一致带来的类加载冲突,警告就会消失了。
内容的提问来源于stack exchange,提问作者sjayanna

