Как фильтровать ресурсы при использовании плагина maven jetty? - PullRequest
8 голосов
/ 19 сентября 2011

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

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

Проблема заключается в попытке запустить приложение в режиме разработки с помощью подключаемого модуля Maven-Jetty (плагин Maven Jetty) в качестве 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гуру, чтобы найти обходной путь (подсказка: это вызов!).

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

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

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

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

С уважением, Ллойд Форс

Ответы [ 4 ]

12 голосов
/ 19 сентября 2011

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

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

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

  3. Добавьте немного магии в pom.xml:

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

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

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

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

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

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

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

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

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

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

3 голосов
/ 11 сентября 2012

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

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

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

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

2 голосов
/ 08 июля 2014

добавить это в 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 за вдохновение; -)

0 голосов
/ 02 октября 2014

Я нашел другой путь.

создайте проект и добавьте целевую папку как дополнительный путь к классу.

<webAppConfig>
    ....
    <extraClasspath>${basedir}/target/mywebapp</extraClasspath>
    ....
</webAppConfig>
...