如果我的Java應用程序使用兩個JARS,每個JARS都具有相同版本的庫,那麼JVM是否只加載一次庫?JVM加載重複庫
JVM加載重複庫
回答
如果您有兩個名稱不同的相同jar文件,那麼JVM將從它找到的第一個jar中加載類,但在這種情況下,您將找不到任何問題。
如果您有兩個名稱不同的jar,但它們包含相同類的不同版本,那麼您遇到了問題,因爲您不知道JVM首先加載哪個類的哪個版本。
如果您對某個特定版本有嚴重依賴並希望避免衝突,請考慮類重定位,以便您的特定版本具有與另一版本不同的名稱。例如,maven-share插件提供了重定位:https://maven.apache.org/plugins/maven-shade-plugin/examples/class-relocation.html – Costlow 2014-09-25 21:11:28
@Nicolas Barrera,當你有不同的應用程序使用與WebLogic等應用程序容器中的相同庫/ JAR相同。對於同一臺服務器,這些庫會被加載兩次嗎? – user994165 2014-10-14 14:04:53
@ user994165假設你有兩個應用程序,每個應用程序都有*內*(例如:app1/WEB-INF/lib,如果是webapp),那麼是的,那些庫中的類將被加載兩次。如果這些庫是相同的,但是隻有版本不同,因爲容器內的每個應用程序都有自己的類加載器,所以每個應用程序始終會加載正確的版本。 如果在你的情況下庫是相同的版本,你可以通過安裝這個庫作爲一個容器的公共庫來節省內存,所以apps類加載器會在它的父類加載器(容器的類加載器)中找到lib。 – 2014-10-14 14:13:13
- 1. 重新加載JVM進程保留Session
- 2. 無法加載JVM
- 3. JVM中的類加載器
- 4. 何時由JVM加載類?
- 5. 在JVM中加載類
- 6. Ember重複加載模型
- 7. NStimer加載重複值
- 8. 如何從Java JVM卸載庫(DLL)
- 9. 在JVM運行時期間重新加載類
- 10. 當JVM通過JNI啓動時重新加載java類路徑
- 11. 無法加載庫:/usr/lib/jvm/java-6-openjdk/jre/lib/i386/xawt/libmawt.so
- 12. SWT:UnsatisfiedLinkError,無法在32位JVM上加載x64 SWT庫
- 13. 在JVM中並行加載同一個庫的不同版本
- 14. JVM在加載庫類後會做些什麼??
- 15. 爲什麼JVM無法從數據庫加載類?
- 16. 在64位JVM中加載32位.so庫
- 17. 加載文本文件到數據庫合併重複
- 18. 處理數據倉庫加載中的主鍵重複
- 19. JVM在類加載期間memcpy崩潰
- 20. 在jvm中加載java熱點類
- 21. JVM無法正確加載類
- 22. 如何JVM加載父類中的Java
- 23. 使用r5加載network.dat時JVM崩潰
- 24. JavaVM的警告:JAWT_GetAWT必須加載JVM
- 25. 如何調試JVM資源加載?
- 26. 如何解決Java JVM加載失敗?
- 27. 如何在運行時重新加載/刷新屬性而無需重啓jvm?
- 28. JVM類加載器無法加載從擴展類路徑
- 29. 如何在JVM中使用類加載器加載類兩次?
- 30. 使用不同的加載器在JVM中加載兩次類
JVM不知道庫是什麼。它只是在需要的時候加載類路徑中的類,如果有兩個具有相同規範名稱的類,它只加載它遇到的第一個類,如果它們不同或不相同則不加主。正如你可能已經猜到的那樣 - 這可能會導致很多問題,特別是如果你使用依賴於其他第三方庫的*不同版本的第三方庫。幸運的是OSGi解決了這個問題:) – 2014-09-25 19:44:19
它也是一個允許影子類的java的neet工件。它有時是唯一的跨越水災的橋樑。 – Hannes 2014-09-25 20:18:20