LinkageError: when resolving interface method "com.hazelcast.core.IMap.getLocalMapStats()Lcom/hazelcast/monitor/LocalMapStats;"
LinkageError: when resolving interface method "com.hazelcast.core.IMap.getLocalMapStats()Lcom/hazelcast/monitor/LocalMapStats;"
我们在日志中得到的异常如下。这是一个maven项目
Caused by: java.lang.LinkageError: loader constraint violation: when resolving interface method "com.hazelcast.core.IMap.getLocalMapStats()Lcom/hazelcast/monitor/LocalMapStats;" the class loader (instance of <bootloader>) of the current class, java/lang/Object, and the class loader (instance of weblogic/utils/classloaders/ChangeAwareClassLoader) for the method's defining class, com/hazelcast/core/IMap, have different Class objects for the type com/hazelcast/monitor/LocalMapStats used in the signature
at java.lang.invoke.MethodHandleNatives.resolve(Native Method) ~[?:1.8.0_141]
at java.lang.invoke.MemberName$Factory.resolve(MemberName.java:975) ~[?:1.8.0_141]
at java.lang.invoke.MemberName$Factory.resolveOrFail(MemberName.java:1000) ~[?:1.8.0_141]
at java.lang.invoke.MethodHandles$Lookup.resolveOrFail(MethodHandles.java:1386) ~[?:1.8.0_141]
at java.lang.invoke.MethodHandles$Lookup.findVirtual(MethodHandles.java:861) ~[?:1.8.0_141]
at io.micrometer.core.instrument.binder.cache.HazelcastIMapAdapter.resolveIMapMethod(HazelcastIMapAdapter.java:202) ~[micrometer-core-1.5.7.jar:1.5.7]
at io.micrometer.core.instrument.binder.cache.HazelcastIMapAdapter.<clinit>(HazelcastIMapAdapter.java:39) ~[micrometer-core-1.5.7.jar:1.5.7]
我们在项目中使用 Hazelcast 3.12.9 和许多其他依赖项。我确实理解 java.lang.LinkageError 是在找到 class 的 2 个或更多版本时发生的。根据上面的消息,似乎有 2 个版本的 com.hazelcast.monitor.LocalMapStats 正在加载。未回答的问题有
- 如何找到有 2 个版本 com.hazelcast.monitor.LocalMapStats class 的 jar?
- 加载程序和
在这个错误中有什么作用吗?
- 还有另一种方法可以通过指定 prefer-web-inf-classes = false(更多详细信息 https://docs.oracle.com/cd/E12840_01/wls/docs103/webapp/weblogic_xml.html#wp1067857)
好吧,情况很艰难。我会使用 jar 来提取 类,然后使用 grep 和 awk 脚本来寻找重复项。
像这样:
jar -xvf ../hazelcast-all-3.12.9.jar
grep -R com.hazelcast.monitor.LocalMapStats * | awk '{print }'
您可能想要删除所有 Hazelcast 罐子并清理您的 .m2 或您拥有的任何回购缓存。然后添加hazelcast-all,看看问题是否解决。
在 Oracle 支持上,我发现了一篇文章 1316723.1,其中说我们不应该在您的 weblogic.xml 中使用 wls:prefer-web-inf-类。这是一个古老的做法,我们应该在 weblogic-applicaton.xml.
中使用过滤类加载器
可是我的问题还是没有解决。看起来 micrometer-core-1.5.7.jar 和 com.hazelcast-3.12.9 之间存在版本兼容性问题。 Micrometer 需要版本 4.X 的 Hazlecast。但不知何故,我的项目正在加载 hazelcast 3.12.9。
有两个不同的 class 版本的 LocalMapStats 可用,因此在加载 class 时出现问题。
为了避免这种情况,我们可以设置 prefer application resources
<weblogic-application>
<prefer-application-resources>
<resource-name>com/hazelcast/map/LocalMapStats.class</resource-name>
</prefer-application-resources>
</weblogic-application>
我们在日志中得到的异常如下。这是一个maven项目
Caused by: java.lang.LinkageError: loader constraint violation: when resolving interface method "com.hazelcast.core.IMap.getLocalMapStats()Lcom/hazelcast/monitor/LocalMapStats;" the class loader (instance of <bootloader>) of the current class, java/lang/Object, and the class loader (instance of weblogic/utils/classloaders/ChangeAwareClassLoader) for the method's defining class, com/hazelcast/core/IMap, have different Class objects for the type com/hazelcast/monitor/LocalMapStats used in the signature
at java.lang.invoke.MethodHandleNatives.resolve(Native Method) ~[?:1.8.0_141]
at java.lang.invoke.MemberName$Factory.resolve(MemberName.java:975) ~[?:1.8.0_141]
at java.lang.invoke.MemberName$Factory.resolveOrFail(MemberName.java:1000) ~[?:1.8.0_141]
at java.lang.invoke.MethodHandles$Lookup.resolveOrFail(MethodHandles.java:1386) ~[?:1.8.0_141]
at java.lang.invoke.MethodHandles$Lookup.findVirtual(MethodHandles.java:861) ~[?:1.8.0_141]
at io.micrometer.core.instrument.binder.cache.HazelcastIMapAdapter.resolveIMapMethod(HazelcastIMapAdapter.java:202) ~[micrometer-core-1.5.7.jar:1.5.7]
at io.micrometer.core.instrument.binder.cache.HazelcastIMapAdapter.<clinit>(HazelcastIMapAdapter.java:39) ~[micrometer-core-1.5.7.jar:1.5.7]
我们在项目中使用 Hazelcast 3.12.9 和许多其他依赖项。我确实理解 java.lang.LinkageError 是在找到 class 的 2 个或更多版本时发生的。根据上面的消息,似乎有 2 个版本的 com.hazelcast.monitor.LocalMapStats 正在加载。未回答的问题有
- 如何找到有 2 个版本 com.hazelcast.monitor.LocalMapStats class 的 jar?
- 加载程序和
在这个错误中有什么作用吗? - 还有另一种方法可以通过指定 prefer-web-inf-classes = false(更多详细信息 https://docs.oracle.com/cd/E12840_01/wls/docs103/webapp/weblogic_xml.html#wp1067857)
好吧,情况很艰难。我会使用 jar 来提取 类,然后使用 grep 和 awk 脚本来寻找重复项。 像这样:
jar -xvf ../hazelcast-all-3.12.9.jar
grep -R com.hazelcast.monitor.LocalMapStats * | awk '{print }'
您可能想要删除所有 Hazelcast 罐子并清理您的 .m2 或您拥有的任何回购缓存。然后添加hazelcast-all,看看问题是否解决。
在 Oracle 支持上,我发现了一篇文章 1316723.1,其中说我们不应该在您的 weblogic.xml 中使用 wls:prefer-web-inf-类。这是一个古老的做法,我们应该在 weblogic-applicaton.xml.
中使用过滤类加载器可是我的问题还是没有解决。看起来 micrometer-core-1.5.7.jar 和 com.hazelcast-3.12.9 之间存在版本兼容性问题。 Micrometer 需要版本 4.X 的 Hazlecast。但不知何故,我的项目正在加载 hazelcast 3.12.9。
有两个不同的 class 版本的 LocalMapStats 可用,因此在加载 class 时出现问题。 为了避免这种情况,我们可以设置 prefer application resources
<weblogic-application>
<prefer-application-resources>
<resource-name>com/hazelcast/map/LocalMapStats.class</resource-name>
</prefer-application-resources>
</weblogic-application>