我想我已经知道了答案,但如果有人能为我确认,我将不胜感激。
A) We are including a library in a build using maven-shade-plugin;
B) This library implements singleton(s);
C) Our resulting jar (uber-jar) is, in turn, used in a build of a megaproject;
D) Other jars in a megaproject also using the same library (A);
图书馆(A)是不是在整个大型项目中扮演单身人士的角色? 我们最终会为工件的每个着色副本设置一组单独的静态变量吗? 使用maven-assembly-plugin而不是maven-shade插件会有帮助吗?
答案 0 :(得分:1)
您描述了一个场景,其中同一个类可能不止一次地在类路径中结束。
在这样的应用程序中,类加载器将获取在查找该类时找到的第一个。一旦找到它,这个类就被这个类加载器加载并初始化,他不会再查找它了。通常情况下这不会导致问题,您仍然可以根据需要使用单身人士:仅限一个实例。
如果 - 由于某种原因 - 你手头有多个类加载器,它们每个都可以从另一个位置加载这个类。所以你可以用几个单例实例结束。
阴影插件似乎不是最好的工具。我建议只将它用于包装在单个着色JAR中的独立应用程序 - 最终产品。
我们总是使用程序集插件,因为它可以对打包的程序集进行更精细的控制。但是你不应该使用着色的JAR作为依赖,而只是使用核心库。即使您在项目中的各种依赖关系路径中具有相同的依赖关系,程序集插件也只会将其打包一次。