java如何使Jetty动态加载“静态”页面
我正在构建JavaWeb应用程序,我讨厌传统的“代码编译部署测试”周期。我想输入一个微小的更改,然后立即看到结果,而无需编译和部署
幸运的是,Jetty对于这一点非常有用。它是一个纯java web服务器。它附带了一个非常好的maven plugin,可以让您直接从构建树启动Jetty reading——无需打包war文件或部署。它甚至还有一个scanInterval设置:将其设置为非零值,它将监视java文件和各种配置文件的更改,并在您进行更改后几秒钟自动重新部署
只有一件事让我远离涅盘。我的src/main/webapp目录中有javascript和css文件,Jetty刚刚提供了这些文件。我希望能够编辑这些,并在浏览器中刷新页面时显示更改。不幸的是,Jetty将这些文件保持打开状态,因此我无法(在Windows上)在运行时修改它们
有人知道如何让Jetty放弃这些文件,以便我可以编辑它们,然后为后续请求提供编辑后的文件吗
# 1 楼答案
虽然上面的一个答案对于通过xml配置jetty是完全正确的,但是如果您想在代码中配置此选项(对于嵌入式服务器),答案是不同的,并且在该页面上找不到
你会在网上找到许多建议,包括
上下文。getInitParams()。put(“useFileMappedBuffer”、“false”)
或者重写WebAppContext,或者为init参数使用完全限定的名称。这些建议都不适用于我(使用Jetty 7.2.2)。部分问题是需要在WebAppContext用于服务静态文件的servlet上设置useFileMappedBuffer选项,而不是在上下文上设置
最后,我在一个简单的ServletContextHandler上做了类似的事情
# 2 楼答案
在webdefault中将false设置为useFileMappedBuffer。xml对我来说不起作用(Jetty 8.1.10.v20130312)。 幸运的是,将maxCachedFiles设置为0(也在webdefault.xml中)成功了
# 3 楼答案
Jetty使用内存映射文件来缓冲静态内容,这会导致文件在Windows中锁定。尝试将
DefaultServlet
的useFileMappedBuffer
设置为false
Troubleshooting Locked files on Windows (from the Jetty wiki)有指令
# 4 楼答案
Jetty 9.2 documentation给出了一个Jetty嵌入式示例,该示例使用
ResourceHandler
而不是servlet来服务静态文件:Jetty使用NIO(内存文件映射),因此locks files on Windows operating systems。这是一个已知的问题,可以为servlet找到许多解决方法
但是,由于此示例不依赖servlet,因此基于webapp参数(useFileMappedBuffer、maxCachedFiles)的关联答案不起作用
为了防止内存中的文件映射,您需要添加以下配置行:
注:如Javadoc中所述(并由nimrodm注意到):
the minimum size in bytes of a file resource that will be served using a memory mapped buffer, or -1 for no memory mapped buffers
。然而,我得到了与值Integer.MAX_VALUE
相同的行为设置此参数后,Jetty可以在Windows上提供静态文件,您可以编辑这些文件
# 5 楼答案
虽然这是一个老问题,但我发现thispost非常有用,简而言之,只需将配置更改为
这将禁用Jetty中的NIO支持(但对于简单情况下的调试puropse来说,这应该不是问题)
# 6 楼答案
我也有这个问题
我不想创建任何额外的类,也不想搞乱web。xml
下面是你能做的:
假设您的项目是基于maven的,并且(比方说)被称为“我的web应用程序”
创建一个文件
my-web-app/jetty/jetty-config.xml
把这些东西放进去:
这是您的jetty配置:
此解决方案将向servlet上下文添加一个属性,该属性将禁用静态资源锁定
玩得开心:)