Как настроить статические ресурсы и пользовательские службы с помощью встроенного Jetty? - PullRequest
7 голосов
/ 22 февраля 2012

Я пытаюсь настроить простой веб-сервис для своего приложения, встраивая Jetty. Мне бы хотелось иметь две разные веб-службы: простой HTTP-сервер, который просто обслуживает статический контент (который в конечном итоге станет приложением GWT) и пользовательский сервлет, который может выдавать сообщения о состоянии JSON для приложения.

Моя структура папок дистрибутива выглядит примерно так:

+ dist/
  - MyApp.jar
  + lib/
  + html/
    - index.html

И вот что у меня есть для настройки встроенного сервера. Я правильно получаю свой тестовый вывод из моего пользовательского сервлета при посещении http://localhost/data/, но я не могу заставить DefaultServlet найти мой файл index.html.

public Webserver(int port) {
    server = new Server(port);

    ServletContextHandler context = new ServletContextHandler();
    context.setResourceBase("./html/");
    server.setHandler(context);


    JsonDataApiServlet dataServlet = new JsonDataApiServlet();
    DefaultServlet staticServlet = new DefaultServlet();

    context.addServlet(new ServletHolder(dataServlet), "/data/*");
    context.addServlet(new ServletHolder(staticServlet), "/*");
}

Кажется, что это обычная задача для людей, внедряющих Jetty в вещи ... я даже на правильном пути?

Редактировать

Оказывается, эта проблема возникла из-за неправильного понимания того, как относительные пути вычисляются в Причале. Я запускал это из одной папки над папкой dist, используя java -jar dist\MyApp.jar, и Jetty искала dist\..\html вместо правильного dist\html. Запуск jar из папки dist устраняет проблему. Я отвечу с тем, как я сделал это без необходимости запуска из каталога dist.

1 Ответ

6 голосов
/ 22 февраля 2012

Как говорит редакция, это была просто проблема с каталогом, из которого я запускал флягу.Вот метод, который я использовал, чтобы найти папку html, из которой был запущен Jar:

Сначала я добавил папку html в путь к классу манифеста Jar.Следующий код дает html-папку, из которой загружается Jar-файл:

ClassLoader loader = this.getClass().getClassLoader();
File indexLoc = new File(loader.getResource("index.html").getFile());
String htmlLoc = indexLoc.getParentFile().getAbsolutePath();

При этом Classloader находит файл индекса в пути к классам, а затем находит абсолютный каталог для передачи в Jetty:

server = new Server(port);

ServletContextHandler context = new ServletContextHandler();
context.setResourceBase(htmlLoc);
context.setWelcomeFiles(new String[] { "index.html" });
server.setHandler(context);


JsonDataApiServlet dataServlet = new JsonDataApiServlet();
DefaultServlet staticServlet = new DefaultServlet();

context.addServlet(new ServletHolder(dataServlet), "/data/*");
context.addServlet(new ServletHolder(staticServlet), "/*");
...