Как заставить WebApp находить свойства приложения по пути к классам во встроенном причале? - PullRequest
0 голосов
/ 03 октября 2018

У нас есть приложение, которое состоит из файла war и двух файлов свойств.при нормальных обстоятельствах мы просто помещаем войну в / webapps (jetty) и конфигурацию в / resources, и все работает нормально.

Как нам это сделать с помощью встроенного Jetty?Итак, у меня есть файл класса, который может создать встроенный сервер Jetty и развернуть файл war, используя:

WebAppContext ctx = new WebAppContext (warfileLocation, "/");

Сервер запускается, но приложение не запускается, поскольку не может найти свойства, на которые ссылается приложение, которое ожидает найти файл .properties в пути к классам.

Как программно развернуть файлы свойств конфигурации программнов контекст встроенного причала?Предположительно, используя какой-то метод в контексте для ссылки на файлы на моем локальном диске?

Спасибо.

Ответы [ 3 ]

0 голосов
/ 03 октября 2018

Все,

Я нашел решение, используя 'extraClassPath'

    //add application config properties
    String resourcesDirectory = System.getProperty("resourcesDirectory");
    if (resourcesDirectory!=null) {
        String ecp = ctx.getExtraClasspath();
        ecp = ecp + "," + resourcesDirectory;
        ctx.setExtraClasspath(ecp);
    }

Где ctx - это контекст, возвращаемый из:

WebAppContext ctx = new WebAppContext (warfileLocation, "/");

В сущности, вы можете добавить локальный каталог в classpath встроенного сервера Jetty, используя этот метод.Все в этом пути появится в classpath

0 голосов
/ 03 октября 2018

A WebAppContext - это загрузчик классов, изолированный от пути к классу Сервера, что делает содержимое, доступное на пути к классам Сервера, недоступным для WebAppContext.

. У вас есть два варианта.

  1. Flipправила изоляции загрузчика классов.

Если у вас есть только 1 WebAppContext в вашей встроенной пристани, и вам не нужна изоляция загрузчика классов, позвоните WebAppContext.setParentLoaderPriority(true);

Добавьте конкретную нужную вам запись classpath к WebAppContext.

Вы можете позвонить WebAppContext.setExtraClasspath(String), чтобы добавить любые произвольные записи classpath, которые вы хотите, в WebAppContext до того, как она будет добавлена ​​вHandlerCollection и запущен / развернут.

0 голосов
/ 03 октября 2018

Ваша основная цель состоит в том, чтобы ваш конфиг оказался в приложении classpath.То, как вы это сделаете, зависит от ваших вариантов использования.

Вы можете поместить файлы .properties в project/src/main/resources вашего jar-файла (тот, на котором запущена встроенная Jetty), который автоматически находится на пути к классам.

Это полезно при разработке, но это означает, что файлы конфигурации будут включены в ваш скомпилированный файл JAR.Это если вы явно не исключаете их из файла сборки Maven / Gradle, если вы его используете.Для производственного использования вы можете использовать внешнюю конфигурацию.

Например, вы можете поместить файлы конфигурации во внешнюю папку configs, а затем запустить jar, используя java -classpath my.jar:configs/ Main.

Все файлы во внешней папке configs теперь должны находиться на вашем компьютере.classpath.

Конечно, есть и другие варианты изменения classpath.Пожалуйста, смотрите Установка пути к классам .Если вы все еще хотите работать с опцией -jar, вы можете изменить classpath в META-INF/MANIFEST.mf.Эта опция описана здесь .

...