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

时间:2018-11-01 11:59:23

标签: 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

谢谢!

1 个答案:

答案 0 :(得分:1)

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

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

ServletContextHandler

最后一件事,您似乎正在使用Jersey。 (又名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配置。让Jetty负责。 (关于如何完成此操作,这是另一个问题,具体取决于泽西版本,并且已经在stackoverflow上找到了答案)