如何使 Jetty 动态加载“静态”页面

2022-09-01 14:12:48

我正在构建Java Web应用程序,我讨厌传统的“代码 -编译-部署-测试”周期。我想输入一个微小的更改,然后立即查看结果,而无需编译和部署。

幸运的是,码头在这方面很棒。它是一个纯java Web服务器。它带有一个非常好的maven插件,可让您直接从构建树启动Jetty读取 - 无需打包war文件或部署。它甚至有一个scanInterval设置:将其设置为非零值,它将监视您的java文件和各种配置文件的更改,并在您进行更改后几秒钟自动重新部署。

只有一件事能阻止我涅槃。我的src / main / webapp目录中有javascript和css文件,这些文件刚刚由Jetty提供。我希望能够编辑这些内容,并在浏览器中刷新页面时显示更改。不幸的是,Jetty打开了这些文件,所以我无法在运行时(在Windows上)修改它们。

有没有人知道如何让Jetty放弃这些文件,以便我可以编辑它们,然后为后续请求提供编辑后的文件?


答案 1

Jetty 使用内存映射文件来缓冲静态内容,这会导致 Windows 中的文件锁定。尝试将 设置为 。useFileMappedBufferDefaultServletfalse

对Windows上锁定的文件进行故障排除(来自Jetty wiki)有说明。


答案 2

虽然上面的答案之一完全适合通过xml配置jetty,但如果要在代码中配置此选项(对于嵌入式服务器),答案是不同的,并且在该页面上找不到。

您可以在网上找到许多建议,包括

context.getInitParams().put(“useFileMappedBuffer”, “false”);

或者覆盖 WebAppContext,或者对 init 参数使用完全限定的名称。这些建议都不适合我(使用Jetty 7.2.2)。部分问题在于 useFileMappedBuffer 选项需要在 WebAppContext 用于提供静态文件的 servlet 上设置,而不是在上下文中设置。

最后,我在一个简单的ServletContextHandler上做了这样的事情。

// Startup stuff
final Server server = new Server(port);
ServletContextHandler handler = new ServletContextHandler();
handler.setResourceBase(path);

SessionManager sm = new HashSessionManager();
SessionHandler sh = new SessionHandler(sm);
handler.setSessionHandler(sh);

DefaultServlet defaultServlet = new DefaultServlet();
ServletHolder holder = new ServletHolder(defaultServlet);
holder.setInitParameter("useFileMappedBuffer", "false");
handler.addServlet(holder, "/");

server.setHandler(handler);
server.start();
server.join();

推荐