Развертывание сервера Jetty через .jar. Почему я не могу получить доступ к индексу? - PullRequest
0 голосов
/ 01 ноября 2018

Я пытаюсь развернуть сервер Jetty из файла JAR. Когда jar запускается на сервере, он достигает страницы Jetty 404 как минимум, но не может достичь index.html.

Мой основной класс для запуска сервера выглядит следующим образом и прекрасно работает локально при запуске через IDE на localhost:

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 голосов
/ 01 ноября 2018

Используйте URL, полученный от htmlDirectory, в качестве базового ресурса для всего 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.config.server.provider.packages) Убедитесь, что вы отключили конфигурации Джерси, которые заставляют Джерси обслуживать сам статический контент. Пусть Джетти будет ответственным. (относительно того, как это сделать, это другой вопрос, который зависит от версии на Джерси и уже имеет ответы на stackoverflow)

...