2014-01-10 230 views
0

我目前的項目是用Java編寫HTTP-Webserver。服務器每兩秒檢查一次「部署目錄」並搜索名爲content.jar的文件。如果文件被更改,服務器就會部署它。該文件包含將由URLClassLoader加載的servlet。在每個部署中都會創建一個新的類加載器。Web服務器部署問題

在另一個項目中,我的servlet正在開發中。我編寫了一個Ant構建文件,用於創建content.jar文件並將其移動到服務器的部署目錄中。不幸的是,我得到一個Ant錯誤:

BUILD FAILED [path]\WebServerServlet\Ant\Build.xml:15: Unable to remove existing file [path]\WebServer\web\content.jar

我想,該文件被鎖定由JVM文件系統 - 是有沒有辦法告訴Ant它不應該嘗試刪除和移動文件,而是改爲將其覆蓋?

否則,有沒有人有一個想法如何通過更改我的部署系統來避免文件被JVM鎖定?

編輯

我現在已經找到了解決辦法! 在本question討論我不得不添加的唯一的事情就是

URLClassLoader loader = new URLClassLoader(..); 
//class loading stuff here 
loader.close() //the line all the trouble was about 

有了這個附錄我的螞蟻構建文件能夠刪除部署目錄「舊」的罐子和移動新一成多吧。

回答

1

我懷疑classloader在jar上有一個鎖。無論哪種方式,直到鎖定被釋放,您將無法移動,刪除或修改它。

解決方案是編寫自己的類加載器。這是這個自定義的類加載器應該監視你的jar的變化,而不是服務器,然後相應地重新加載類。

編寫一個類加載器來做動態重載有很多參與 - 幸運的是,它的解釋是here