Вставить причал в приложение Java и экспортировать как банку - PullRequest
4 голосов
/ 28 декабря 2011

Я делаю Java-приложение, в которое встроен веб-сервер Jetty, который, в свою очередь, обслуживает контент, разработанный с помощью Google Web Toolkit. Все работает нормально при запуске в Eclipse, но когда я экспортирую его как файл jar, все, что я получаю, это сообщение об ошибке Jetty, говорящее «Файл не найден».

Сервер Jetty запускается так:

    WebAppContext handler = new WebAppContext();
    handler.setResourceBase("./war");
    handler.setDescriptor("./war/WEB-INF/web.xml");
    handler.setContextPath("/");
    handler.setParentLoaderPriority(true);
    server.setHandler(handler);

    try {
        server.start();
        server.join();
    } catch (Exception e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }

Я подозреваю, что проблема заключается в относительных путях, используемых в handler.setResourceBase () и handler.setDescriptor (). Я нашел и проверил множество решений, но пока безрезультатно. В частности, я пытался использовать что-то вроде getClass (). GetResource ("./ war"). ToExternalForm (), но это просто вызывает исключения Null.

Я тоже пробовал:

ProtectionDomain protectionDomain = Start.class.getProtectionDomain();
URL location = protectionDomain.getCodeSource().getLocation();

но это только приводит к тому, что Jetty обслуживает список каталогов классов Java.

Есть ли способ сделать это?

Ответы [ 3 ]

1 голос
/ 31 марта 2012
  1. Скопируйте все файлы скомпилированного приложения GWT в один из ваших пакетов Java. Например:

    my.webapp.resources
      html/MyPage.html
      gwtmodule/gwtmodule.nocache.js
      ...
    

    (html, gwtmodule также станут пакетами Java).

  2. Настройте встроенный экземпляр Jetty для обслуживания этих файлов.

     final String webDir = this.getClass().
           getClassLoader().getResource("my/webapp/resources").toExternalForm();
    
     final Context root = new Context(server, "/", Context.SESSIONS);
     root.setContextPath("/");
     root.setResourceBase(webDir);
     root.addServlet(MyGwtService.class, "/servlets/v01/gwtservice"); 
    

Этот подход работает для меня как при запуске приложения из затмения, так и при его развертывании.

0 голосов
/ 28 июня 2015

Похоже, ClassLoader.getResource не понимает пустую строку или.или / как аргумент.В моем jar-файле мне пришлось перенести все вещи в WEB-INF.Таким образом, код выглядит как

   `contextHandler.setResourceBase(EmbeddedJetty.class.getClassLoader().getResource("WEB-INF").toExternalForm());` 

, поэтому контекст выглядит следующим образом:

ContextHandler: 744 - Запуск oejwWebAppContext @ 48b3806 {/, jar: file: / Users / xxx / projects /раздаточная / щ / цель / щ-1,0-SNAPSHOT.jar! / WEB-INF, ДОСТУПНЫ}

0 голосов
/ 20 июня 2013

Подробное описание того, как это сделать, выложено здесь: http://h30499.www3.hp.com/t5/HP-Software-Developers-Blog/Embedding-Jetty-in-a-Java-Main-Application/ba-p/6107503

...