2014-09-25 36 views
0

如果我的Java應用程序使用兩個JARS,每個JARS都具有相同版本的庫,那麼JVM是否只加載一次庫?JVM加載重複庫

+3

JVM不知道庫是什麼。它只是在需要的時候加載類路徑中的類,如果有兩個具有相同規範名稱的類,它只加載它遇到的第一個類,如果它們不同或不相同則不加主。正如你可能已經猜到的那樣 - 這可能會導致很多問題,特別是如果你使用依賴於其他第三方庫的*不同版本的第三方庫。幸運的是OSGi解決了這個問題:) – 2014-09-25 19:44:19

+0

它也是一個允許影子類的java的neet工件。它有時是唯一的跨越水災的橋樑。 – Hannes 2014-09-25 20:18:20

回答

1

如果您有兩個名稱不同的相同jar文件,那麼JVM將從它找到的第一個jar中加載類,但在這種情況下,您將找不到任何問題。

如果您有兩個名稱不同的jar,但它們包含相同類的不同版本,那麼您遇到了問題,因爲您不知道JVM首先加載哪個類的哪個版本。

+0

如果您對某個特定版本有嚴重依賴並希望避免衝突,請考慮類重定位,以便您的特定版本具有與另一版本不同的名稱。例如,maven-share插件提供了重定位:https://maven.apache.org/plugins/maven-shade-plugin/examples/class-relocation.html – Costlow 2014-09-25 21:11:28

+0

@Nicolas Barrera,當你有不同的應用程序使用與WebLogic等應用程序容器中的相同庫/ JAR相同。對於同一臺服務器,這些庫會被加載兩次嗎? – user994165 2014-10-14 14:04:53

+0

@ user994165假設你有兩個應用程序,每個應用程序都有*內*(例如:app1/WEB-INF/lib,如果是webapp),那麼是的,那些庫中的類將被加載兩次。如果這些庫是相同的,但是隻有版本不同,因爲容器內的每個應用程序都有自己的類加載器,所以每個應用程序始終會加載正確的版本。 如果在你的情況下庫是相同的版本,你可以通過安裝這個庫作爲一個容器的公共庫來節省內存,所以apps類加載器會在它的父類加載器(容器的類加載器)中找到lib。 – 2014-10-14 14:13:13