![](/img/trans.png)
[英]Maven - How to remove module-info.class warning for shaded .jar?
[英]How the class loader works in Java with a shaded jar
我对 Java class 加载的体验是有限的。 使用像 Maven 这样的工具,我对它们如何解析依赖版本有一个生疏的理解。 但是我遇到了一个问题,这让我质疑 Java 如何加载类。
我的场景依赖于com.google.guava
30.1.1-jre
版本。 我还有一个阴影 jar,它依赖于 Guava 18.0。
在我的应用程序中,我最终看到以下异常
java.lang.IncompatibleClassChangeError: Class com.google.common.base.Suppliers$MemoizingSupplier 没有实现请求的接口 java.util.function.Supplier
我无法在本地复制。 基于https://github.com/crabhi/celery-java/issues/9听起来这个错误是在类路径上有旧版本的 Guava 时产生的。
检查我看到的战争中的课程
WEB-INF/lib/java-driver-shaded-guava-25.1-jre-graal-sub-1.jar.d/com/datastax/oss/driver/shaded/guava/common/base/Suppliers$MemoizingSupplier.class
WEB-INF/lib/nautilus-es2-library-2.3.4.jar.d/com/google/common/base/Suppliers$MemoizingSupplier.class
WEB-INF/lib/guava-30.1.1-jre.jar.d/com/google/common/base/Suppliers$MemoizingSupplier.class
这让我觉得阴影 jars 引起了问题。
那可能吗? 有没有文章解释shaded jars进入图片时类是如何加载的?
您在类路径上有两个com.google.common.base.Suppliers.MemoizingSupplier
的副本。 只能加载一个,在您的情况下,它是旧版本。
您不应该为一个类加载器提供多个具有相同名称的类。 nautilus-es2-library-2.3.4.jar 是什么,为什么它捆绑 Guava 而不是将其表示为传递依赖项?
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.