【问题标题】:Unable to access static resources in JAR file using embedded Jetty无法使用嵌入式 Jetty 访问 JAR 文件中的静态资源
【发布时间】:2019-06-21 15:09:00
【问题描述】:

我基本上和这个问题有同样的问题:

Setting Jetty resourcebase to static file embedded in the same jar file

我在哪里使用嵌入式 Jetty,我想访问同一个 JAR 文件中的一些静态 HTML 文件。

这是 Jetty 服务器的设置方式:


    ServletContextHandler context = new ServletContextHandler(ServletContextHandler.SESSIONS);
    context.setContextPath("/");
    String res = ApiServer.class.getClassLoader().getResource("res").toExternalForm();
    context.setResourceBase(res);

    jettyServer = new Server(port);
    jettyServer.setHandler(context);

    ServletHolder jerseyServlet = context.addServlet(ServletContainer.class, "/*");
    jerseyServlet.setInitOrder(0);

    // Tells the Jersey Servlet which REST service/class to load.
    String classes = new StringJoiner(",")
            .add(MyClass1.class.getCanonicalName())
            .add(MyClass2.class.getCanonicalName())
            .toString();

    jerseyServlet.setInitParameter(ServerProperties.PROVIDER_CLASSNAMES, classes);

JAR的文件夹结构是这样的:

root
  |  src (Java classes in here)
  |  res
      |  index.html

但是它不起作用。我尝试通过各种方式访问​​ URL:

http://localhost:12345/res/index.html

http://localhost:12345/index.html

但两者都不起作用。

我做错了什么?

【问题讨论】:

    标签: jar jetty embedded-jetty


    【解决方案1】:

    你的代码...

    String res = ApiServer.class.getClassLoader().getResource("res").toExternalForm();
    context.setResourceBase(res);
    

    对我不起作用,因为您不能使用类加载器来获取目录引用,只能使用文件引用。调用 ClassLoader.getResource("res") 总是返回 null。

    这需要先解决。

    接下来,你对泽西岛的声明太贪心了。

    ServletHolder jerseyServlet = context.addServlet(ServletContainer.class, "/*");
    jerseyServlet.setInitOrder(0);
    

    这意味着 Servlet (ServletContainer.class) 正在处理 100% 的所有请求,甚至是静态内容请求。

    根据您的 url 模式,该 Servlet 不可能“不处理”静态请求并让 Jetty 为这些静态请求提供服务。

    放松这个 url-pattern,说/api/*,然后你会更近一步。

    您最后需要的是DefaultServlet(Servlet 规范中的组件,以及提供静态文件的 Jetty)。

    所以你会得到以下代码...

    ServletContextHandler context = new ServletContextHandler(ServletContextHandler.SESSIONS);
    context.setContextPath("/");
    URL url = ApiServer.class.getClassLoader().getResource("res/index.html");
    if (url == null)
       throw new FileNotFoundException("Whoops, can't find static resources folder");
    URI webroot = url.toURI().resolve("./");
    context.setBaseResource(Resource.newResource(webroot));
    
    ServletHolder jerseyServlet = context.addServlet(ServletContainer.class, "/api/*");
    jerseyServlet.setInitOrder(0);
    
    // Tells the Jersey Servlet which REST service/class to load.
    String classes = new StringJoiner(",")
            .add(MyClass1.class.getCanonicalName())
            .add(MyClass2.class.getCanonicalName())
            .toString();
    
    jerseyServlet.setInitParameter(ServerProperties.PROVIDER_CLASSNAMES, classes);
    
    // always named "default", always last, always on url-pattern "/"
    ServletHolder defaultServ = new ServletHolder("default", DefaultServlet.class);
    defaultServ.setInitParameter("dirAllowed","true");
    context.addServlet(defaultServ,"/");
    
    jettyServer = new Server(port);
    jettyServer.setHandler(context);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-11-05
      • 2012-05-04
      • 2015-07-08
      • 1970-01-01
      • 2021-06-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多