java - Web服务器部署问题

标签 java deployment ant locking webserver

我当前的项目正在用 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/

相关文章:

java - 没有使用 emma、junit 和 ant 的运行时覆盖

Java Mail - 创建电子邮件通知系统的最佳实践/有效方法

java - 获取函数引用的注释

visual-studio-2010 - 每晚进行ASP.NET MVC 3网站部署的最简单方法是什么?

java - Azure 应用服务上的 Jetty 部署如何工作?

sql-server - 在持续部署中设置 DacUpgradeOptions.IgnoreDataLoss 标志的最佳实践?

Java - Apache Ivy 无法正确解析依赖项

java - 使用 ANT 构建时出现 "Build Failed: failed to create task or type classpath"

java - 将文件从源复制到计算机

java - 使用 TwitterUtils 过滤掉用户