我把头撞在墙上。我写了一个小型嵌入式码头服务器(码头 9.4.18,泽西岛 1.19.4),我一生都无法让它尊重上下文路径和部署的 REST 服务。
我尝试了setContextPath,但这在ServletContextHandler上从未奏效,所以我选择了WebAppContext。
这和我能得到的一样简单:
Server jettyServer = new Server(9999);
// set up the web app
WebAppContext webapp = new WebAppContext();
webapp.setContextPath("/app/");
webapp.setResourceBase("web");
jettyServer.setHandler(webapp);
// add REST service
ServletHolder jerseyServlet = webapp.addServlet(ServletContainer.class, "/service/*");
final ResourceConfig resourceConfig = new ResourceConfig(RestService.class);
resourceConfig.register(MultiPartFeature.class);
jerseyServlet.setInitParameter("jersey.config.server.provider.packages", "org.futureboy.app.server.rest");
try {
jettyServer.start();
jettyServer.join();
} catch (Exception e) {
e.printStackTrace();
//jettyServer.stop();
jettyServer.destroy();
}
静态 HTML 文件在web
目录中提供,如果我按如下方式保留此行,这将正常工作:
ServletHolder jerseyServlet = webapp.addServlet(ServletContainer.class, "/service/*");
但是,这意味着 REST 服务(在/app/service 下运行)不起作用。如果我换掉这条线:
ServletHolder jerseyServlet = webapp.addServlet(ServletContainer.class, "/*");
然后 REST 服务工作正常,但现在静态 HTML 内容无法正常工作。所以我要么在/app/
上得到一个工作的静态HTML服务,要么在/app/service
下面得到一个有效的REST服务,但我不能两者兼而有之。我做错了什么?RestService.java 文件启动如下:
@Path("/service")
public class RestService {
任何帮助将不胜感激,因为我觉得我被困在这里的一码线上。
为什么您希望泽西岛提供静态内容?
这不是 JAX-B 服务器的角色。
怎么办...
- 从
WebAppContext
切换到ServletContextHandler
(您不需要WebAppContext
的开销,也不需要全面的WebAppContext
带来的任何字节码扫描或注释扫描部署技术的开销。 - 阻止泽西岛投放静态内容。
- 设置适当的资源库 - 使用完全限定的路径或 URI(无相对路径,无部分 URI)
- 在默认 url 模式
"/"
上添加一个名为"default"
的DefaultServlet
。
这些更改 Jetty 将从您的资源库中提供静态内容。
Jetty 侧配置和 DefaultServlet 用法的一些先前答案/示例:
- 通过.jar部署 Jetty 服务器。为什么我无法访问索引?
- 如何从 Jar 获取嵌入式 Jetty 提供 html 文件,而不是战争
- 从嵌入式 Jetty 中的备用路径提供静态文件
- 使用 Jetty 嵌入式容器时,ServletContextHandler.setResourceBase 和 ResourceHandler.setResourceBase 有什么区别?
- 码头:默认的 servlet 上下文路径
- 显示 Jetty Serverlet doGet 方法中资源文件夹中的静态 HTML 文件
关于如何将 Jersey 配置为不提供静态内容,有很多答案。
我最喜欢的一个是提供的解决方案...
- 用于提供静态内容的 Servlet