Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/386.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何使Payara(Eclipse Payara工具)更新所有/过时的文件?_Java_Eclipse_Servlets_Payara - Fatal编程技术网

Java 如何使Payara(Eclipse Payara工具)更新所有/过时的文件?

Java 如何使Payara(Eclipse Payara工具)更新所有/过时的文件?,java,eclipse,servlets,payara,Java,Eclipse,Servlets,Payara,我使用Eclipse(版本:2019-09 R(4.13.0)构建id:20190917-1200)编码,并使用Payara工具(1.0.0.201909271753)管理本地Payara服务器(5.201#badassfish(构建512)) 该项目相当广泛,使用多个库;Eclipse Java项目和.jar文件。 它还有85个WebServlet类。基本上一切都很好,只有一个例外: 我有一个名为“DbMerge”的WebServlet类 @WebServlet("/dyn/db/m

我使用Eclipse(版本:2019-09 R(4.13.0)构建id:20190917-1200)编码,并使用Payara工具(1.0.0.201909271753)管理本地Payara服务器(5.201#badassfish(构建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->Debug as->Debug on Server)时,它会正确部署,没有问题

当我在DbMerge中更改代码时,Payara工具会自动并正确地将更改的AOD上传到Payara服务器。当我通过服务器上的浏览器访问
/dyn/db/merge/dbmerge
时,我总能获得dbmerge本身的正确最新行为

当我更改某些Java项目库或HttpConnector类中的代码时,它与DbMerge位于完全相同的包/目录中,Payara Tools仍然告诉我它正在重新发布一段时间。(Eclipse服务器视图从
[Started,Synchronized]
[Started,repubish]
[Started,Synchronized]

但是:当我在浏览器中再次访问
/dyn/db/merge/dbmerge
时,HttpConnector(或库中的其他类)中的代码更改不会生效。为了使这些更改生效,我必须“重新启动”或重新部署项目

在本例中,我会:

  • 部署项目
  • Access
    /dyn/db/merge/dbmerge
    =>日志显示“新闻1”
  • 第二行评论(新闻2)
  • Eclipse/Payara工具刷新
  • 我清理日志
  • 当我访问
    /dyn/db/merge/dbmerge
    时:日志仅显示新的“新闻1”,而它应该显示“新闻1”和“新闻2”
  • 我假设这是一种运行时优化,只加载一次类,并且只重新加载HttpServlet类型的类或带有@WebServlet注释的类,并在“重新发布”后被访问

    那么,如何让Eclipse/Payara工具/Payara服务器也更新那些陈旧的文件进行开发呢

    更新

    我发现,如果我编写
    公共类HttpConnector扩展HttpServlet
    (即使HttpConnector不应该是HttpServlet)并完全重新部署项目,那么它将始终保持该文件的最新状态,并始终产生预期的行为。 如果我部署时没有“extends”并在以后添加它(仅重新发布),它将无法工作

    更新2

    看起来Payara中有一个缓存错误。我必须完全停止并重新启动Payara,然后使用
    类HttpConnector extends HttpServlet部署我的项目,然后它就可以工作了

    如果我取消部署项目并重新部署(或者只是从Eclipse服务器视图“重新启动”它),则
    类HttpConnector extends HttpServlet
    的效果将不起作用,内容将保持陈旧。因此,第一次部署似乎是关键部分,随后的取消部署和部署将不再影响这一点…

    在Payara GitHub存储库中有一个与您类似的问题。它解决了在部署时重新加载配置文件的问题。基本上,对于开发环境来说,有一些第三方选项可以用于重新加载,例如,但对于部署环境来说,没有什么真正的选项。从sound if it来看,Payara也不打算开发这样的功能

    引用RedHat高级顾问Mikecroft的话:

    Hi@edilmar-热重新加载已由#886处理为@lprimak 提到。这不是我们想要添加的功能,因为它是 JRebel已经很满意了,但这不是一个用于 生产。ZeroTurnaround在创建 相当于在生产中工作的LiveRebel,但是 在发布后不久就停止了

    滚动升级将为您提供所需的零停机时间,或者 您想转向更现代的容器驱动部署样式, 有第三方工具可以让您实现同样的目标 docker的事

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


    对问题是,Payara服务器中已经存在某种形式的热/重新部署。每当我在Eclipse中保存更改时,任何更改的文件都会被上传,但只有在首次部署时标记为@WebServlet的文件才会被热替换。不重新启动项目,保持静态内容不变。但是,即使正常的热替换(如在调试模式下Eclipse中对非静态内容的更改)可以正常工作,在第一次部署时未使用WebServlet标记的文件(甚至在以后使用WebServlet标记的文件)也不会得到更新。因此,我假设Payara端存在一些负载优化的bug。如果不回答你会得到赏金好的。。。为了不搞砸stackoverflow的工作原理,我给了你赏金,但收回了被接受的答案。因为这或多或少还是开放的。