Как фильтровать ресурсы при использовании плагина 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:
- поставить urlrewrite.xml в новом каталоге src / main / webResources и добавьте его в плагин Maven war и включите фильтрацию. Это скопирует его содержимое в соответствующем месте, когда война будет упакована, но не сделает его доступным для jetty: run
- некоторые другие хаки, я даже не помню ... (если я делаю)
В общем, Maven-jetty-plugin должен находиться под файлом src/main/ресурсы/webapp/вставить путь и имя файла для того, чтобы быть доступным для причала maven:выполнить команду ...
Спасибо за помощь ...
С уважением, Ллойд Форс!--3-->
4 ответов
ответил на мой собственный вопрос.
обновите Maven-jetty-plugin по крайней мере до 6.1.12
см. эту страницу wiki в разделе "Настройка нескольких исходных каталогов WebApp" (доступно с jetty-6.1.12.rc2 и причал-7.0.0pre3)
добавьте немного магии в 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>