繁体   English   中英

class 加载程序如何在 Java 中工作,带有阴影 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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM