【发布时间】:2021-04-10 09:24:58
【问题描述】:
我在 Eclipse 中编码(版本:2019-09 R (4.13.0) Build id:20190917-1200)并使用 Payara Tools (1.0.0.201909271753) 来管理本地 Payara 服务器 (5.201 #badassfish (build 512) )。
该项目相当广泛,并使用多个库; Eclipse Java 项目和 .jar 文件。 它还有 85 个 WebServlet 类。基本上一切都很好,除了一个例外:
我有一个名为“DbMerge”的 WebServlet 类
@WebServlet("/dyn/db/merge/dbmerge")
public class DbMerge extends HttpServlet {
@Override protected void doGet(final HttpServletRequest pReq, final HttpServletResponse pResp) throws IOException {
final HttpConnector c = new HttpConnector();
c.printNews();
}
}
还有另一个类,称为 HttpConnector:
public class HttpConnector {
public void printNews() {
System.out.println("News 1");
// System.out.println("News 2"); // comment in later
}
}
当我部署动态 Web 项目时(右键单击 prohect -> 调试为 -> 在服务器上调试)它部署正确,没有问题。
当我在 DbMerge 中更改代码时,Payara Tools 会自动正确地将更改上传到 Payara 服务器。当我通过服务器上的浏览器访问/dyn/db/merge/dbmerge 时,我总是能获得 DbMerge 本身正确的最新行为。
当我更改某些 Java 项目库或类 HttpConnector 中的代码时,该代码与 DbMerge 位于完全相同的包/目录中,Payara Tools Stills 告诉我它正在重新发布一段时间。 (Eclipse Server 视图从 [Started, Synchronized] 到 [Started, Republish] 到 [Started, Synchronized])。
但是:当我在浏览器中再次访问/dyn/db/merge/dbmerge 时,HttpConnector(或库中的其他类)中的代码更改不会生效。我必须“重新启动”或重新部署项目才能使这些更改生效。
在这个例子中,我这样做:
- 部署项目
- 访问
/dyn/db/merge/dbmerge=> 日志显示“新闻1” - 评论-在第二行(新闻2)
- Eclipse/Payara 工具刷新
- 我清除日志
- 当我访问
/dyn/db/merge/dbmerge:日志只显示一个新的“新闻1”,当它应该显示“新闻1”和“新闻2”时
我假设这是某种运行时优化,它只加载一次类,并且只重新加载类型为 HttpServlet 或使用 @WebServlet 注释并在“重新发布”后访问的类
那么我如何让 Eclipse / Payara Tools / Payara Server 也更新那些用于开发的其他陈旧文件?
更新
我发现如果我写 public class HttpConnector extends HttpServlet(即使 HttpConnector 不应该是 HttpServlet)并完全重新部署项目,那么它将始终使该文件保持最新并始终产生预期的行为。
如果我在没有“扩展”的情况下部署并稍后添加(仅重新发布)它将无法工作。
更新 2
Payara 中似乎存在缓存错误。我必须完全停止并重新启动 Payara,然后在 class HttpConnector extends HttpServlet 已经就位的情况下部署我的项目,然后它就可以工作了。
如果我取消部署项目并重新部署(或者只是从 Eclipse 服务器视图“重新启动”它),class HttpConnector extends HttpServlet 的效果将不起作用,内容将保持陈旧。所以第一次部署似乎是关键部分,以后取消部署和部署将不再影响它......
【问题讨论】:
标签: java eclipse servlets payara