我当前的项目正在用 Java 编写一个 HTTP-Webserver。服务器每两秒检查一次“部署目录”并搜索名为 content.jar
的文件。如果文件发生更改,服务器将部署它。该文件包含将由 URLClassLoader
加载的 servlet。每次部署时都会创建一个新的类加载器。
在另一个项目中,我正在开发 servlet。我编写了一个 Ant-buildfile,它创建 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
通过这个附录,我的 Ant-buildfile 能够删除部署目录中的“旧”jar 并将新的 jar 移入其中。
最佳答案
我怀疑类加载器锁定了 jar。无论哪种方式,在锁被释放之前,您都将无法移动、删除或修改它。
解决方案是编写自己的类加载器。这个自定义类加载器应该监视您的 jar 的更改,而不是服务器,然后相应地重新加载类。
编写类加载器来进行动态重新加载涉及很多内容 - 幸运的是,它已经被解释了 here .
关于java - Web服务器部署问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21040219/