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