java - 通过 .jar 部署 Jetty 服务器。为什么我无法访问索引?

标签 java jar jetty

我正在尝试从 jar 文件部署 Jetty 服务器。当jar在服务器上运行时,它至少到达Jetty 404页面,但无法到达index.html

用于启动服务器的主类如下所示,并且在本地主机上通过 IDE 运行时可以在本地正常工作:

public static void main(String[] args) {
    Server server = new Server(8080);

    ServletContextHandler servletContextHandler = new ServletContextHandler(NO_SESSIONS);
    servletContextHandler.setContextPath("/");

    DefaultServlet defaultServlet = new DefaultServlet();
    ServletHolder holderPwd = new ServletHolder("default", defaultServlet);

    final URL htmlDirectory = JerseyApplication.class.getResource("/html");

    holderPwd.setInitParameter("resourceBase", htmlDirectory.getFile());

    servletContextHandler.addServlet(holderPwd, "/*");
    server.setHandler(servletContextHandler);

    ServletHolder servletHolder = servletContextHandler.addServlet(ServletContainer.class, "/api/*");
    servletHolder.setInitOrder(0);
    servletHolder.setInitParameter(
            "jersey.config.server.provider.packages",
            "com.x.y.z.parser");

    try {
        LOGGER.info("Starting server");
        server.start();
        server.join();
    }
    catch (Exception ex) {
        LOGGER.error("Server failed to start - Aborting");
        ex.printStackTrace();
    }
    finally {
        LOGGER.info("Destroying server");
        server.destroy();
    }
}

所有 html 内容都在 src/main/resources/html 目录中。

当我运行jar tvf jarfile.jar | grep html 我可以看到 html 目录,它的内容就在那里:

0 Thu Nov 01 11:48:46 UTC 2018 html/
2258 Thu Nov 01 11:48:46 UTC 2018 html/formRequest.js
871 Thu Nov 01 11:48:46 UTC 2018 html/index.html

谢谢!

最佳答案

使用从 htmlDirectory 获取的 URL 作为整个 ServletContextHandler 的基础资源。

有关详细信息,请参阅之前的答案:https://stackoverflow.com/a/39019797/775715

final URL htmlDirectory = JerseyApplication.class.getResource("/html");

// TODO: Handle error if htmlDirectory == null

ServletContextHandler servletContextHandler = new ServletContextHandler(NO_SESSIONS);
servletContextHandler.setContextPath("/");
servletContextHandler.setBaseResource(Resource.newResource(htmlDirectory));

DefaultServlet defaultServlet = new DefaultServlet();
ServletHolder holderPwd = new ServletHolder("default", defaultServlet);
// holderPwd.setInitParameter("resourceBase", htmlDirectory.getFile()); <-- not needed here
servletContextHandler.addServlet(holderPwd, "/"); // NOTE: MUST be "/" not "/*"!

最后一件事,您似乎正在使用 Jersey。 (又名jersey.config.server.provider.packages) 确保禁用 Jersey 配置,使 Jersey 本身提供静态内容。让 Jetty 负责。 (至于这是如何完成的,这是另一个问题,这是 Jersey 版本特定的,并且已经在 stackoverflow 上有了答案)

关于java - 通过 .jar 部署 Jetty 服务器。为什么我无法访问索引?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53100868/

相关文章:

java - 无法使用 selenium 中的 poi jar 将所有记录写入 Excel 表中

java - 如何将java项目转换为.exe?

java - 通过添加 JAR 文件 Openshift 磁盘配额已满

redirect - HTTP2 请求不遵循 JMeter 5.0 中的重定向

java - 从类路径设置嵌入式 Jetty war

Linux Websocket 协议(protocol)版本 8 与 13

java - dispose() 的问题;

java - java.library.path 中没有 swt-mozilla-gtk-4332

java - Spring Boot - 如何指定备用启动类? (多个入口点)

Java - Runtime.exec() 无法运行