2011-09-10 34 views
2

應用程序需要從運行時提供的jar中加載類。這些jar應該被刪除,並在運行時被其他jar取代,因爲看起來ClassLoader並沒有釋放罐子上的文件句柄。Java Classloader在Windows下不釋放文件句柄

這是一個已知的問題?是否有可用的類加載器,但沒有此問題?

編輯:用例不是加載相同類的不同版本,而是加載相同接口的不同實現。這些類使用應用程序必須調用的「execute」方法實現接口。所以雖然類的卸載機制在這種情況下也是有用的,但這不是主要的用例。

回答

1

在類加載器卸載之前,ClassLoader不會釋放該jar。如果不創建新的類加載器,則無法加載新版本的類,因此我沒有看到您希望如何工作。

也許你想要的是一個OSGi容器,比如Apache Karaf,它允許你在運行時加載/卸載庫。

+0

我爲我的問題添加了一個解釋來澄清,這不是關於加載同一類的不同版本,但感謝您的答案無論如何:-) –

+0

如果您只想添加類,但不使用目錄來做這個,Clark的建議可能會起作用。 –

3

看看這個What is the reason that setDefaultUseCaches(false) of URLConnection is eagerly called in the org.apache.catalina.core.JreMemoryLeakPreventionListener

它也許可以回答你的問題。當使用UrlConnection,並將緩存設置爲true時,它不會關閉文件處理程序。

此外,它提供了一種解決方法來將緩存設置爲false。

URL url = new URL("jar:file://dummy.jar!/"); 
URLConnection uConn = new URLConnection(url) { 
    @Override 
    public void connect() throws IOException {   
     // NOOP  
    } 
}; 
uConn.setDefaultUseCaches(false); 

這隻需要在使用URLConnection之前在靜態塊中調用。

這取決於你的類加載器是如何實現的。

相關問題