2016-09-27 42 views
2

我想我已經知道答案了,但是如果有人能爲我確認,我將不勝感激。maven-shade-plugin和singletons

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

maven-shade-plugin如何與單例相關? –

+0

我認爲在多項目項目中,我們包含了幾個(例如)mypackage.Mysingleton類的實現。我擔心這些實現不能看到彼此的靜態屬性。 – Alexander

回答

1

您描述了一個場景,其中同一個類可能不止一次地在類路徑中結束。

在這樣的應用程序中,類加載器會在找到該類時找到第一個。一旦找到它,這個類將被這個類加載器加載並初始化,並且他不會再查找它。通常情況下,這不會導致問題,並且您仍然可以根據需要使用單例:僅限一個實例。

如果 - 由於某種原因 - 您有多個類裝載器,他們每個都可以從另一個位置加載這個類。所以你可以結束幾個單例實例。

陰影插件似乎不是最好的工具。我建議僅將它用於您打包在單個着色JAR中的獨立應用程序 - 最終產品。

我們總是使用程序集插件,因爲它對包裝程序集提供了更精細的控制。但是,您不應該使用帶陰影的JAR作爲依賴關係,而應該簡單地使用核心庫。即使您在項目中的各種依賴路徑中具有相同的依賴項,程序集插件也只會打包一次。

+0

好的,我明白了。我希望我能減少對maven-shade-plugin的依賴。在像我們這樣的大型組織中,「大項目」取決於多個組件,而這些組件又取決於相同的庫。該圖書館是一個活躍的項目,並且一度在突破性變革中引入了它。沒有maven-shade-plugin,所有組件都必須同步升級,這是一個後勤噩夢。 maven-shade-plugin似乎能夠解決這個問題,但現在我看到了這些問題。 – Alexander