嵌入式Jetty不提供空文件

嵌入式Jetty不提供空文件,jetty,embedded-jetty,Jetty,Embedded Jetty,设置:我已设置embedded jetty v9.1,使用setDirectoriesListedtrue为静态文件提供服务,我使用的代码如下: //创建一个基本Jetty服务器对象,该对象将侦听端口8080。请注意,如果将其设置为端口0 //然后将分配一个随机可用的端口,您可以在日志中查找该端口, //或者以编程方式获取它以在测试用例中使用。 服务器=新服务器9090; //创建ResourceHandler。它是实际处理给定文件请求的对象。它是 //Jetty处理程序对象,因此它适合与其他处

设置:我已设置embedded jetty v9.1,使用setDirectoriesListedtrue为静态文件提供服务,我使用的代码如下:

//创建一个基本Jetty服务器对象,该对象将侦听端口8080。请注意,如果将其设置为端口0 //然后将分配一个随机可用的端口,您可以在日志中查找该端口, //或者以编程方式获取它以在测试用例中使用。 服务器=新服务器9090; //创建ResourceHandler。它是实际处理给定文件请求的对象。它是 //Jetty处理程序对象,因此它适合与其他处理程序链接,如您将在其他示例中看到的。 ResourceHandler resource\u handler=新的ResourceHandler; //配置ResourceHandler。设置资源库指示文件应该从何处提供。 //在本例中,它是当前目录,但可以配置为jvm可以访问的任何内容。 resource_handler.setDirectoriesListedtrue; resource_handler.setwelcomefiles新字符串[]{index.html}; resource_handler.setResourceBase。; //将ResourceHandler添加到服务器。 HandlerList handlers=新HandlerList; handlers.setHandlersnew Handler[]{resource_Handler,new DefaultHandler}; server.setHandlerhandlers; //开始吧!通过使用server.join,服务器线程将与当前线程连接。 //看http://docs.oracle.com/javase/1.5.0/docs/api/java/lang/Thread.htmljoin 更多细节。 server.start; server.join; 此代码源于

当我导航到该地址时,我会看到目录中列出的文件,我可以单击并打开单个文本文件

问题:出于某种莫名其妙的原因,只有当我单击一个0字节的文件(也称为空文件,但仍显示在浏览器中)时,连接才会尝试加载,但最终超时30秒,我在safari中收到一个响应,说服务器意外断开了连接。此外,当我与0字节文件建立HttpUrl连接时,返回的内容长度为-1;这当然只适用于空文件

在standalone Jetty中看到的预期行为:当我使用standalone Jetty并提供相同的文件时,我能够打开空文件,在web浏览器中只返回一个空白页面。使用HttpURLConnection时,我得到的内容长度为0

虽然这似乎是一项毫无意义的任务,但有一台服务器正在以编程方式与嵌入式jetty服务器同步,因此我希望这些空文件能够同步。我想这与资源处理程序在提供静态内容时看到0字节有关,但我不太确定如何获得独立jetty服务器的相同行为,因为现在,它在尝试提取空文件时出错


谢谢

您的代码至少在Jetty 9.2.7.v20140116上可以正常工作

我使用的完整示例:

包装码头; 导入java.io.File; 导入org.eclipse.jetty.server.Handler; 导入org.eclipse.jetty.server.server; 导入org.eclipse.jetty.server.handler.DefaultHandler; 导入org.eclipse.jetty.server.handler.HandlerList; 导入org.eclipse.jetty.server.handler.ResourceHandler; 公共类简单资源 { 公共静态无效字符串[]args { 服务器=新服务器9090; 字符串resourceBase=System.getPropertyresourceBase。; System.err.printfResource库为:%s%n,新文件ResourceBase.getAbsolutePath; ResourceHandler resource\u handler=新的ResourceHandler; resource_handler.setDirectoriesListedtrue; resource_handler.setwelcomefiles新字符串[]{index.html}; resource_handler.setResourceBaseresourceBase; HandlerList handlers=新HandlerList; handlers.setHandlersnew Handler[]{resource_Handler,new DefaultHandler}; server.setHandlerhandlers; 尝试 { server.start; server.join; } 捕获可丢弃的t { t、 printStackTraceSystem.err; } } } 我将-DresourceBase系统属性指向具有以下内容的目录运行它

$ ls -la
total 8
drwxrwxr-x. 2 joakim joakim 4096 Jan 20 11:53 .
drwxrwxr-x. 3 joakim joakim 4096 Jan 20 11:53 ..
-rw-rw-r--. 1 joakim joakim    0 Jan 20 11:53 foo.txt
一旦运行控制台显示

2015-01-20 11:55:07.788:INFO::main: Logging initialized @68ms
Resource Base is: /home/joakim/code/Jetty/empties
2015-01-20 11:55:07.837:INFO:oejs.Server:main: jetty-9.2.7.v20150116
2015-01-20 11:55:07.860:INFO:oejs.ServerConnector:main: Started ServerConnector@5461eda{HTTP/1.1}{0.0.0.0:9090}
2015-01-20 11:55:07.861:INFO:oejs.Server:main: Started @144ms
像这样的测试请求

$ curl --dump-header - http://localhost:9090/foo.txt
HTTP/1.1 200 OK
Date: Tue, 20 Jan 2015 18:55:39 GMT
Content-Type: text/plain
Content-Length: 0
Server: Jetty(9.2.7.v20150116)
更新:

在jetty的以下版本上保持原样,不做任何修改。没有对版本进行详尽的测试,只有一些旧版本

9.2.6.v20141205-相同的结果 9.2.4.v20141103-相同的结果 9.2.1.v20140609-相同结果 9.1.5.v20140505-响应标题中没有日期,其余内容相同是,它还发送内容长度:0
啊,所以我没有意识到我有一个9.0.4.v20130625.jar,它正在使用它,只是通过读取您的输出来检查我的输出才注意到。我删除了旧的jetty-all库,并用jetty-all-9.3.0替换了它,现在它可以正常工作了。我猜在我使用的9.0.4版本中有一些bug。。。标记为已解决。