Как фильтровать ресурсы при использовании плагина 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: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, потому что он использует контекст.getResourceAsString ("/WEB-INF/classes / urlrewrite.xml") для загрузки файла конфигурации. Jetty возвращает null для этого, потому что при запуске приложения из рабочей области он разрешает /WEB-INF/classes/... в src / main / webapp / WEB-INF/... . Файл не существует, потому что война еще не собран. Вместо этого он должен вытащить ресурс из target/classes/urlrewrite.XML.

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

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

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

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

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

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

4 ответов


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

  1. обновите Maven-jetty-plugin по крайней мере до 6.1.12

  2. см. эту страницу wiki в разделе "Настройка нескольких исходных каталогов WebApp" (доступно с jetty-6.1.12.rc2 и причал-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, он предназначен только для jetty!

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

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

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

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

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

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

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


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

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

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

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


добавьте это в pom.XML-код:

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

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

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


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

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

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