【问题标题】:How to make Payara (Eclipse Payara Tools) update all/stale files?如何让 Payara (Eclipse Payara Tools) 更新所有/陈旧文件?
【发布时间】: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(或库中的其他类)中的代码更改不会生效。我必须“重新启动”或重新部署项目才能使这些更改生效。

在这个例子中,我这样做:

  1. 部署项目
  2. 访问/dyn/db/merge/dbmerge => 日志显示“新闻1”
  3. 评论-在第二行(新闻2)
  4. Eclipse/Payara 工具刷新
  5. 我清除日志
  6. 当我访问/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


    【解决方案1】:

    有一个closed issue 关于 Payara GitHub 存储库中与您的问题类似的问题。它解决了部署时重新加载配置文件的问题。基本上有一些用于重新加载的开发环境的第三方选项,例如JRebel,但对于部署环境来说却没有。从声音上看,Payara 也不打算开发这样的功能。

    引用 RedHat 高级顾问 Mikecroft 的话:

    嗨@edilmar - 热重载已由#886 解决为@lprimak 提及。这不是我们想要添加的功能,因为它是 JRebel 已经满足了,但这不是要使用的产品 生产。 ZeroTurnaround 投入了大量精力来创建一个 相当于在名为 LiveRebel 的生产环境中工作,但是 发布后不久就停产了..

    滚动升级将为您提供所需的零停机时间,或者,如果 您想转向更现代的容器驱动部署风格, 有第三方工具可以让您实现相同的目标 码头工人的事情。

    我现在就结束这个,因为这不是我们要追求的。

    【讨论】:

    • 是的。问题是,Payara 服务器中已经存在某种形式的热/重新部署。每当我在 Eclipse 中保存更改时,都会上传任何更改的文件,但只有在第一次部署时标记为 @WebServlet 的文件才会被热替换。不重新启动项目,保持静态内容不变。但是,即使正常的热替换(例如在调试模式下对 Eclipse 中的非静态内容的更改)应该可以正常工作,但在第一次部署时(或什至稍后标记)未使用 WebServlet 标记的文件不会得到更新。所以我认为Payara方面存在一些加载优化的错误。如果没有+答案,您将获得赏金
    • 啊,好吧...为了不搞乱 stackoverflow 的工作方式,我给了你赏金,但收回了接受的答案。因为这或多或少仍然是开放的。
    猜你喜欢
    • 1970-01-01
    • 2023-03-16
    • 1970-01-01
    • 2013-04-24
    • 2022-11-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-28
    相关资源
    最近更新 更多