應用程序需要從運行時提供的jar中加載類。這些jar應該被刪除,並在運行時被其他jar取代,因爲看起來ClassLoader並沒有釋放罐子上的文件句柄。Java Classloader在Windows下不釋放文件句柄
這是一個已知的問題?是否有可用的類加載器,但沒有此問題?
編輯:用例不是加載相同類的不同版本,而是加載相同接口的不同實現。這些類使用應用程序必須調用的「execute」方法實現接口。所以雖然類的卸載機制在這種情況下也是有用的,但這不是主要的用例。
應用程序需要從運行時提供的jar中加載類。這些jar應該被刪除,並在運行時被其他jar取代,因爲看起來ClassLoader並沒有釋放罐子上的文件句柄。Java Classloader在Windows下不釋放文件句柄
這是一個已知的問題?是否有可用的類加載器,但沒有此問題?
編輯:用例不是加載相同類的不同版本,而是加載相同接口的不同實現。這些類使用應用程序必須調用的「execute」方法實現接口。所以雖然類的卸載機制在這種情況下也是有用的,但這不是主要的用例。
在類加載器卸載之前,ClassLoader不會釋放該jar。如果不創建新的類加載器,則無法加載新版本的類,因此我沒有看到您希望如何工作。
也許你想要的是一個OSGi容器,比如Apache Karaf,它允許你在運行時加載/卸載庫。
它也許可以回答你的問題。當使用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之前在靜態塊中調用。
這取決於你的類加載器是如何實現的。
我爲我的問題添加了一個解釋來澄清,這不是關於加載同一類的不同版本,但感謝您的答案無論如何:-) –
如果您只想添加類,但不使用目錄來做這個,Clark的建議可能會起作用。 –