maven-shade-plugin和singletons

时间:2016-09-27 17:04:35

标签: java maven maven-shade-plugin

我想我已经知道了答案,但如果有人能为我确认,我将不胜感激。

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插件会有帮助吗?

1 个答案:

答案 0 :(得分:1)

您描述了一个场景,其中同一个类可能不止一次地在类路径中结束。

在这样的应用程序中,类加载器将获取在查找该类时找到的第一个。一旦找到它,这个类就被这个类加载器加载并初始化,他不会再查找它了。通常情况下这不会导致问题,您仍然可以根据需要使用单身人士:仅限一个实例。

如果 - 由于某种原因 - 你手头有多个类加载器,它们每个都可以从另一个位置加载这个类。所以你可以用几个单例实例结束。

阴影插件似乎不是最好的工具。我建议只将它用于包装在单个着色JAR中的独立应用程序 - 最终产品。

我们总是使用程序集插件,因为它可以对打包的程序集进行更精细的控制。但是你不应该使用着色的JAR作为依赖,而只是使用核心库。即使您在项目中的各种依赖关系路径中具有相同的依赖关系,程序集插件也只会将其打包一次。