Каков правильный 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?
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());
В приветственном файле я поместил конкретный текст для определения источника файла (в папке ресурсов). В браузере:
Служит для файла helloWorld.html.
Показывает список каталогов в каталоге 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" });