2014-01-10 180 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