Как фильтровать ресурсы при использовании плагина maven jetty?

У меня есть XML-файл (urlrewrite.xml), для которого нужно разрешить заполнитель свойства. Для этого я включаю фильтрацию Maven. Это отлично работает для собранного файла WAR.

<build>
    <resources>
        <resource>
            <directory>src/main/resources</directory>
            <filtering>true</filtering>
        </resource>

Проблема заключается в том, что при попытке запустить приложение в режиме разработки с использованием maven-jetty-plugin (Maven Jetty Plugin) в качестве maven jetty: run.

Рассматриваемый файл urlrewrite.xml находится в каталоге src / main / resources, и поэтому должен (и делает) заканчиваться в / WEB-INF / classes (или target / classes для maven jetty: run).

Конфигурация URLRewriteFilter указывает расположение файла конфигурации следующим образом:

<filter>
    <filter-name>UrlRewriteFilter</filter-name>
    <filter-class>org.tuckey.web.filters.urlrewrite.UrlRewriteFilter</filter-class>
    <init-param>
        <param-name>confPath</param-name>
        <param-value>/WEB-INF/classes/urlrewrite.xml</param-value>
    </init-param>
</filter>

Это будет работать во время развертывания. Однако при использовании плагина jetty maven URLRewrite умрет с исключением NullPointerException, потому что он использует context.getResourceAsString ("/ WEB-INF / classes / urlrewrite.xml") для загрузки файла конфигурации. Jetty возвращает для этого значение null, потому что при запуске приложения из рабочей области оно разрешает / WEB-INF / classes / ... в src / main / webapp / WEB-INF / .... Файл там не существует, потому что WAR еще не собран. Вместо этого он должен извлечь ресурс из target / classes / urlrewrite.xml.

Если вам это непонятно, то вы, вероятно, не сможете ответить на этот вопрос, потому что я подозреваю, что вам нужно быть гуру Jetty, чтобы найти обходной путь (подсказка: это проблема!).

Кто-нибудь знает способ обойти это? Я также пробовал следующие обходные пути, чтобы узнать о avail:

  1. Поместите urlrewrite.xml в новый каталог src / main / webResources и добавьте его в плагин maven war ‹webReources› и включите фильтрацию. Это скопирует его содержимое в соответствующее место при упаковке WAR, но не сделает его доступным для пристани: run
  2. Некоторые другие хаки, которые я даже не могу вспомнить ... (обновлю, если я запомню)

Таким образом, maven-jetty-plugin необходимо, чтобы файл находился в src / main / resources / webapp / вставьте путь и имя файла, чтобы он был доступен для maven jetty: команда запуска ...

Спасибо за помощь ...

С уважением, Lloyd Force


person les2    schedule 19.09.2011    source источник


Ответы (4)


Ответил на свой вопрос.

  1. Обновите maven-jetty-plugin как минимум до версии 6.1.12.

  2. См. Эту страницу вики на тему «Настройка нескольких исходных каталогов веб-приложений» (доступно с jetty-6.1.12.rc2 и jetty-7.0.0pre3)

  3. Добавьте волшебства в pom.xml:

Сначала добавьте новый каталог (src / main / webResources) для ваших отфильтрованных веб-ресурсов и добавьте элемент ‹resource›:

        <resource>
            <directory>src/main/webResources</directory>
            <filtering>true</filtering>
            <targetPath>../jettyFilteredResources</targetPath>
        </resource>

Это скопирует файлы в target / jettyFilteredResources (мы обратимся к этому позже). Этот каталог НЕ будет скопирован в ваш упакованный файл WAR, он предназначен только для причала!

Добавьте следующий элемент в свой maven-war-plugin ‹configuration› элемент:

                <webResources>
                    <resource>
                        <directory>src/main/webResources</directory>
                        <filtering>true</filtering>
                    </resource>
                </webResources>

Это гарантирует, что все будет упаковано для вашего настоящего файла WAR.

Наконец, скажите причалу использовать ресурсы, которые вы скопировали специально для него, добавив следующий фрагмент в элемент ‹baseResource›:

<baseResource implementation="org.mortbay.resource.ResourceCollection">                        
    <resourcesAsCSV>src/main/webapp,target/jettyFilteredResources</resourcesAsCSV>
</baseResource>

Теперь все заработает! (Ну, технически я еще не тестировал производственную WAR, но ... мля ... она тоже должна работать).

Если у кого-то есть лучший ответ, я приму его при условии, что ответ будет предоставлен в разумные сроки (скажем, за 1 день).

person les2    schedule 19.09.2011
comment
+1 За документирование решения (в сети СТОЛЬКО неотвеченных вопросов). Если это работает для вас, примите себя. Кстати, пробовали ли вы добавить профиль maven «Разработка» со специализированной фильтрацией ресурсов? Это был подход, который я применил для своего веб-проекта без причала. - person Alexander Pogrebnyak; 20.09.2011
comment
При желании используйте maven-replacer-plugin и попросите его записать замененный файл в каталог / WEB-INF / classes /. Это обеспечит существование структуры dir. - person Steven; 20.09.2011
comment
Для тех, кто использует Jetty 9: org.eclipse.jetty.util.resource.ResourceCollection вместо org.mortbay.resource.ResourceCollection. - person RockMeetHardplace; 10.05.2016

Я думаю, что ответ на этот другой вопрос лучше:

Запуск фильтров ресурсов при использовании причала: запустить

По сути, вместо запуска «mvn jetty: run» вы должны использовать «mvn jetty: run-exploded».

Единственный недостаток состоит в том, что необходимо создать файл WAR, что в некоторых случаях может быть дорогостоящим. Если для вас это не проблема, то, думаю, так лучше.

person dgaviola    schedule 10.09.2012
comment
позвольте мне сказать вам, что запускать-взорвать - не вариант; вы говорите о нескольких секундах вместо нескольких минут; по крайней мере, так было в то время, когда был написан этот пост. решение, которое я опубликовал выше, дает вам лучшее из обоих миров. да, это взлом. но он вообще не просачивается в реальное приложение. это просто хитрость для сборки, о которой вы можете забыть после ее настройки. попробуйте и дайте мне знать, что вы думаете. Признаюсь, мой ответ был немного кратким, поскольку я писал для опытного пользователя maven. Я мог бы обновить более подробную информацию, если вы думаете, что это поможет. - person les2; 11.10.2012

добавьте это в pom.xml:

    <resources>
        <resource>
            <directory>src/main/webapp/WEB-INF</directory>
            <filtering>true</filtering>
            <targetPath>../jettyFilteredResources</targetPath>
        </resource>
    </resources>

и вот так должен выглядеть встроенный сервер Jetty:

        <plugin>
            <groupId>org.eclipse.jetty</groupId>
            <artifactId>jetty-maven-plugin</artifactId>
            <version>9.1.3.v20140225</version>
            <configuration>
                <webAppConfig>
                    <descriptor>target/jettyFilteredResources/web.xml</descriptor>
                </webAppConfig>
                <scanIntervalSeconds>3</scanIntervalSeconds>
            </configuration>
        </plugin>

woila! спасибо @ les2 за вдохновение ;-)

person jirka.pinkas    schedule 08.07.2014
comment
Приходилось ли вам самостоятельно реализовывать эту функцию для плагина jetty-maven-plugin? Если так, то это здорово. Это, безусловно, значительно упрощает требуемую конфигурацию. - person les2; 23.07.2014

Я нашла другой способ.

построить проект и добавить целевую папку в качестве дополнительного пути к классам.

<webAppConfig>
    ....
    <extraClasspath>${basedir}/target/mywebapp</extraClasspath>
    ....
</webAppConfig>
person Coen Damen    schedule 02.10.2014