我当前的项目是用Java编写一个。服务器每两秒钟检查一次“部署目录”,并搜索名为content.jar的文件。如果文件被更改,服务器将部署它。该文件包含由URLClassLoader加载的servlet。在每个部署中都会创建一个新的类加载器。
在另一个项目中,我的servlet正在开发中。我编写了一个Ant构建文件,该文件创建content.jar文件并将其移动到服务器的部署目录中。不幸的是,我得到了一个Ant错误:
生成失败的path\WebServerServlet\Ant\Build.xml:15:无法删除现有文件path\WebServer\web\content.jar
我假设这个文件是由JVM锁定在文件系统上的--有没有办法告诉Ant不应该尝试删除和移动文件,而应该重写它呢?
否则,有人知道如何通过更改我的部署系统来避免JVM锁定文件吗?
编辑
我现在找到了解决办法!正如在这个问题中所讨论的,我必须添加的唯一一件事情是
URLClassLoader loader = new URLClassLoader(..);
//class loading stuff here
loader.close() //the line all the trouble was about有了这个附录,我的Ant-buildfile就能够删除部署目录中的“旧”jar,并将新的jar移动到其中。
发布于 2014-01-10 10:40:12
我怀疑类加载器有一个锁在罐子上。无论哪种方式,在锁被释放之前,您都无法移动、删除或修改它。
解决方案是编写您自己的类加载器。应该是这个定制的类加载器监视jar的更改,而不是服务器,然后相应地重新加载类。
在编写类加载器以执行动态重新加载时涉及到许多问题--幸运的是,它已经解释了这里。
https://stackoverflow.com/questions/21040219
复制相似问题