如何使用嵌入式码头设置上下文路径?

How do I set a context path with embedded jetty?

我正在用头撞墙。我写了一个微型嵌入式码头服务器(码头 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 {

任何帮助将不胜感激,因为我觉得我被困在一码线上了。

为什么要 Jersey 提供静态内容?

这不是 JAX-B 服务器的作用。

做什么...

  1. WebAppContext 切换到 ServletContextHandler(您不需要 WebAppContext 的开销或完全成熟的 [=10] 的任何字节码扫描或注释扫描部署技术=] 带来 table.
  2. 防止 Jersey 提供静态内容。
  3. 设置正确的 ResourceBase - 使用完全限定的路径或 URI(无相对路径,无部分 URI)
  4. 在默认 url-pattern "/" 上添加一个 DefaultServlet 命名为 "default".

Jetty 将从您的资源库中为静态内容提供哪些更改。

Jetty 端配置和 DefaultServlet 用法的一些先前answers/examples:

  • Serving static files from alternate path in embedded Jetty
  • Display static HTML file from resources folder in Jetty Serverlet doGet method

关于如何将 Jersey 配置为不提供静态内容的答案有很多。

我最喜欢的一个解决方案是...

  • Servlet for serving static content