可以卸載類的唯一方法是使用的類加載器是垃圾收集。這意味著,對每個(gè)類和類加載器本身的引用都需要遵循dodo的方式。
解決問題的一個(gè)可能的解決方案是為每個(gè)JAR文件配備一個(gè)ClassLoader,為每個(gè)AppServers配置一個(gè)ClassLoader,將類的實(shí)際加載委托給特定的Jar類加載器。這樣,您就可以為每個(gè)App服務(wù)器指向不同版本的JAR文件。
不過,這并不是小事一樁。OSGi平臺(tái)正努力做到這一點(diǎn),因?yàn)槊總€(gè)包都有不同的類加載器,并且依賴項(xiàng)由平臺(tái)解決。也許一個(gè)好的解決辦法就是看看它。
如果您不想使用OSGI,一種可能的實(shí)現(xiàn)是使用JarClassLoader為每個(gè)JAR文件初始化。
并創(chuàng)建一個(gè)新的多類加載器類,該類擴(kuò)展了ClassLoader。這個(gè)類在內(nèi)部有一個(gè)JarClassloaders的數(shù)組(或列表),在fineClass()方法中,將遍歷所有內(nèi)部類加載器,直到找到定義或拋出NoClassDefFoundException為止??梢蕴峁讉€(gè)訪問器方法來向類中添加新的JarClassloader。對于MultiClassLoader,在網(wǎng)絡(luò)上有幾種可能的實(shí)現(xiàn),因此您甚至可能不需要編寫自己的實(shí)現(xiàn)。
如果為到服務(wù)器的每個(gè)連接實(shí)例化MultiClassLoader,原則上每個(gè)服務(wù)器都可能使用同一類的不同版本。
我在一個(gè)項(xiàng)目中使用了MultiClassLoader的思想,其中包含用戶定義腳本的類必須從內(nèi)存中加載和卸載,并且運(yùn)行得很好。