**赏金6天后到期。回答这个问题可以获得+500声望奖励。jayc667正在寻找一个可靠来源的答案。
我正在用eclipse(版本:2019-09r(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工具会自动并正确地上传更改到payara服务器。当我进入 /dyn/db/merge/dbmerge
通过服务器上的浏览器,我总能获得dbmerge本身的最新正确行为。
当我在某个java项目库或类httpconnector中更改与dbmerge位于完全相同的包/目录中的代码时,payara tools仍然告诉我它正在重新发布一段时间(eclipse服务器视图 [Started, Synchronized]
至 [Started, Republish]
至 [Started, Synchronized]
).
但是:当我进入 /dyn/db/merge/dbmerge
同样在浏览器中,httpconnector(或库中的其他类)中的代码更改不会生效。我必须'重新启动'或重新部署项目,以使这些更改生效。
在这个例子中,我做了:
部署项目
访问 /dyn/db/merge/dbmerge
=>日志显示“新闻1”
第二行评论(新闻2)
eclipse/payara工具刷新
我清除日志
当我进入 /dyn/db/merge/dbmerge
:log只显示新的“news 1”,此时它应该显示“news 1”和“news 2”
我假设这是一种运行时优化,只加载一次类,并且只重新加载httpservlet类型的类或带有@webservlet注解的类,并在“重新发布”之后访问
那么,如何让eclipse/payara-tools/payara-server也更新那些过时的文件进行开发呢?
更新
我发现如果我写 public class HttpConnector extends HttpServlet
(即使httpconnector不应该是httpservlet)并完全重新部署项目,那么它将始终保持该文件的最新状态,并始终产生预期的行为。如果我部署时没有“extends”并在以后添加它(仅重新发布),它将无法工作。
更新2
看来帕亚拉有个缓存漏洞。我必须完全停止并重新启动payara,然后使用部署我的项目 class HttpConnector extends HttpServlet
已经准备好了,那就行了。
如果我取消部署项目并重新部署(或者从eclipseservers视图“重新启动”它),那么 class HttpConnector extends HttpServlet
将无法工作,内容将保持陈旧。因此,第一次部署似乎是关键的一部分,后来的联合国部署和部署将不再影响这一点。。。
暂无答案!
目前还没有任何答案,快来回答吧!