Каков правильный URL-адрес, чтобы указать ResourceBase JAR-папки "resources/webapp" для встроенного Jetty?

Нам нужен простой встроенный сервер Jetty с веб-ресурсами в папке ресурсов JAR файлов. Мы имеем некоторые файлы свойств в JAR и загружаем их с использованием пути ресурсов. Мы хотим указать базу ресурсов Jetty:

  • ресурсы / WebApp
  • set: resource_handler. setResourceBase ( "webapp" )
    • Через правильный URL-адрес укажите этот ресурс в файле JAR.

Папка в файле JAR. Это простой JAR файл (не WAR, без фреймворков, без Spring, как ваниль, как мы можем). Исходные тесты продолжают выдавать исключения для следующих строк:

webPath = "jar:file:!/webapp";     //.... runs the Jetty server 
 ... 
resource_handler.setResourceBase( webPath );

Несмотря на то, что сервер работает, результат не находит мой index.html. (Обновить). Этот пример просто берет с Jetty " Embedded File Server". В этом случае требуется, чтобы Jetty База ресурсов отображалась в файле JAR (полный URL):

  • "jar: файл:!/webapp/index.html",

следующим образом:

  • resource_handler.setResourceBase( " баночка: файл:/веб-приложение" );

Вместо приведенного примера:

  • resource_handler.setResourceBase( "");

И мы хотим, чтобы это отображало URL-адрес браузера как:

  • локальный: 8080/index.html
    • ... предоставление...
  • баночка: файл:/веб-приложение/index.html

Для контраста путь JAR, который работает для файлов конфигурации ниже. Вопрос: что должен URL, чтобы база ресурсов Jetty могла обслуживать мой файл Index.html?

  • Ресурсы /
    • конфиг /
      • display.properties

file: "/config/display.properties", и это работает в одном и том же коде проекта, используя операцию загрузки ресурсов. Макет выглядит следующим образом:

 app.jar
   +----- com /
   |        +--- ( classes ... )
   |
   +----- config /
   |        |
   |        +--- display.properties
   |
   +----- webapp /
            |
            +--- index.html

Чтобы дать общую идею.

похожие вопросы:

Ответ 1

У меня есть рабочее решение - Work-around, который я публикую в надежде, что этот подход будет вдохновлять правильный метод. Я по-прежнему считаю, что должен быть способ указать папку внутри JAR по отношению к JAR.

В любом случае этот метод работает. Я использовал его для статического веб-контента сервера из JAR. По сути, у меня есть Java, разрешающий абсолютный путь к запущенному ресурсу JAR и передающий это имя пути Jetty. Когда я делаю это, Jetty отображает мой "helloWorld.html", приветственный файл.

    String  baseStr  = "/webapp";  //... contains: helloWorld.html, login.html, etc. and folder: other/xxx.html
    URL     baseUrl  = SplitFileServerRunner.class.getResource( baseStr ); 
    String  basePath = baseUrl.toExternalForm();

      .... 
    resource_handler.setDirectoriesListed(true);      //... just for testing
    resource_handler.setWelcomeFiles(new String[]{ "helloWorld.html" });
    resource_handler.setResourceBase( basePath );
    LOG.info("serving: " + resource_handler.getBaseResource());

В приветственном файле я поместил конкретный текст для определения источника файла (в папке ресурсов). В браузере:

  • локальный: 8080

Служит для файла helloWorld.html.

  • локальный: 8080/другие

Показывает список каталогов в каталоге jar:/webapp/other/ внутри файла JAR. Это зависит от не изменения JAR во время работы сервера.

В Linux, если кто-то cp - добавляет новый jarfile поверх запущенного JAR, Jetty дает:

 HTTP ERROR: 500

 Problem accessing /. Reason:

        java.lang.NullPointerException

И вы больше не можете обращаться к страницам. Это было неожиданно (очевидно, JAR остается открытым). Хорошей новостью является то, что если вы mv -s jarfile:

  • mv fileserver.jar fileserverXX.jar

Jetty с радостью продолжает работать с (переименованным) файлом fileserverXX.jar. Я могу быть доволен этим. Однако мне все равно хотелось бы узнать эквивалентный относительный путь для соответствия абсолютному имени файла.

Ответ 2

После первоначального ответа некоторые методы изменились, поэтому следующие действия работают так же, но с версией Jetty: 9.4.12.v20180830:

ServletContextHandler webappContext = new ServletContextHandler(ServletContextHandler.SESSIONS);  
URL webRootLocation = JettyStart.class.getResource("/webapp/index.html");  
URI webRootUri = URI.create(webRootLocation.toURI().toASCIIString().replaceFirst("/index.html$", "/"));  
webappContext.setContextPath("/");
webappContext.setBaseResource(Resource.newResource(webRootUri));
webappContext.setWelcomeFiles(new String[] { "index.html" });