Фильтрация веб-ресурсов с помощью плагина Maven war не работает в Eclipse с m2e
Я пытаюсь отфильтровать конфигурационный файл Spring, используя фильтрацию Maven. Мой POM настроен следующим образом:
...
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-war-plugin</artifactId>
<version>2.2</version>
<configuration>
<webResources>
<resource>
<filtering>true</filtering>
<targetPath>WEB-INF/context</targetPath>
<directory>src/main/webapp/WEB-INF/context</directory>
<includes>
<include>applicationContext.xml</include>
</includes>
</resource>
</webResources>
</configuration>
</plugin>
...
и
<profiles>
<profile>
<id>desarrollo</id>
<activation>
<activeByDefault>true</activeByDefault>
</activation>
<build>
<filters>
<filter>src/main/properties/dev.properties</filter>
</filters>
</build>
</profile>
<profile>
<id>pruebas</id>
<build>
<filters>
<filter>src/main/properties/test.properties</filter>
</filters>
</build>
</profile>
...
Он отлично работает при непосредственном вызове Maven.
К сожалению, при горячем развертывании webapp в Tomcat 6 с Eclipse WTP и m2e он всегда выбирает нефильтрованную версию applicationContext.xml. (Файл applicationContext.xml в папке target/m2e-wtp/web-resources/WEB-INF/context никогда не фильтруется)
Я не могу найти полезную документацию по этому вопросу. Я даже не уверен, что он реализован в m2e.
Что-то не так с моей конфигурацией, или это нереализованная функция?
Ответы
Ответ 1
Ну, наконец, я понял.
Прежде всего, я сделал то, что указал ххмарбайс. Я переместил applicationContext.xml в папку ресурсов. Военные плагины webResources предназначены для работы с внешними ресурсами, и фильтрация файла в самой папке назначения не была лучшей практикой.
Я обновил POM, чтобы отразить новую конфигурацию
<resources>
<resource>
<directory>src/main/resources</directory>
<filtering>true</filtering>
</resource>
</resources>
и
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-war-plugin</artifactId>
<version>2.2</version>
<configuration>
<webResources>
<resource>
<filtering>true</filtering>
<targetPath>WEB-INF/context</targetPath>
<directory>src/main/resources/WEB-INF/context</directory>
<includes>
<include>applicationContext.xml</include>
</includes>
</resource>
</webResources>
</configuration>
</plugin>
Итак, половина кредита для него.
Но этого было недостаточно, но все равно не сработало.
Я понял, что Maven/m2e действительно фильтрует мой файл, но он не получил мои определенные файлы свойств. После некоторого тестирования я обнаружил, что m2e игнорирует параметр activeByDefault
в разделе активации профилей.
Итак, я добавил свой профиль по умолчанию к конфигурации проекта Maven, а затем работал
![enter image description here]()
Ответ 2
У меня была аналогичная проблема с фильтрацией web.xml. Я решил проблему, реимпортируя весь проект в eclipse.
Причиной послужил коррумпированный файл /.settings/org.eclipse.wst.common.component. В этом файле определяется порядок файлов, скопированных в каталог развертывания локальных веб-серверов. Например:
<?xml version="1.0" encoding="UTF-8"?><project-modules id="moduleCoreId" project-version="1.5.0">
<wb-module deploy-name="liquidvote-rest">
<wb-resource deploy-path="/" source-path="/target/m2e-wtp/web-resources"/>
<wb-resource deploy-path="/" source-path="/src/main/webapp" tag="defaultRootSource"/>
<wb-resource deploy-path="/WEB-INF/classes" source-path="/src/main/java"/>
<wb-resource deploy-path="/WEB-INF/classes" source-path="/src/main/resources"/>
<property name="context-root" value="myapp"/>
<property name="java-output-path" value="/myapp/target/classes"/>
</wb-module>
</project-modules>
Если web.xml или application.xml существует в нескольких каталогах, это будет взято из первого найденного каталога. Поэтому важно, чтобы
<wb-resource deploy-path="/" source-path="/target/m2e-wtp/web-resources"/>
- первая запись.
Более подробную информацию вы найдете в http://wiki.eclipse.org/M2E-WTP_FAQ в разделе "Что это за папка веб-ресурсов?"
Ответ 3
Пробовали ли вы поместить ресурсы в src/main/resources/WEB-INF/... вместо и настроить область ресурсов фильтровать ресурсы вместо того, чтобы вставлять конфигурацию в местоположение maven по умолчанию.
Ответ 4
У меня была аналогичная проблема. Мое решение не изящно, и я не горжусь этим, но позвольте сказать, что это приемлемо. В моем случае у меня есть приложение w760 для загрузки mvc с приложением swagger (для тестировщиков для тестирования нашего API). Дело в том, что мы используем это приложение в двух средах, поэтому я создал два профиля - dev и test. В dev env мы хотели бы запустить приложение из eclipse с помощью "run as", поэтому путь к контуру пуст (я знаю, что он может быть установлен в spring java config, но это не единственный заменитель, который мы хотели бы переключить) и в тесте env приложение запускается в нашей настраиваемой версии tomcat... так что путь контекста совпадает с именем файла войны.
и вот в чем проблема - чванство вызывает запросы на доступ к этому пути контекста и зависит от профиля spring. Таким образом, у нас есть веб-ресурс, который необходимо фильтровать. Сначала я попытался использовать фильтрацию m2e-wtp:
...
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-war-plugin</artifactId>
<configuration>
<webResources>
<resource>
<filtering>true</filtering>
<directory>src/main/webapp</directory>
<includes>
<include>**/scripts.js</include>
</includes>
</resource>
</webResources>
</configuration>
</plugin>
...
он работал, но работал только в встроенном в eclipse tomcat или из командной строки java -jar, который не работал с "run as" из eclipse.
Ресурс был отфильтрован, и я видел их в веб-ресурсе в целевом, но eclipse, похоже, работает на исходном коде напрямую или делает копию, которую я не знаю... он не может видеть отфильтрованные ресурсы... поэтому Я думал, что сделаю что-то вроде этого:
<resources>
<resource>
<directory>src/main/resources</directory>
</resource>
<resource>
<filtering>true</filtering>
<directory>src/main/resources/webapp/swagger</directory>
<targetPath>${basedir}/src/main/webapp/swagger</targetPath>
<includes>
<include>scripts.js</include>
</includes>
</resource>
</resources>
Это не самое удачное решение, потому что это модификация кода, а не цель, но по крайней мере он работает. Если бы у кого-то были какие-либо предложения, как заставить его работать без изменений кода, я был бы очень благодарен.
Ответ 5
Я пробовал все описанное выше без успеха. Файлы были отфильтрованы и сгенерированы правильно в папке "m2e-wtp", но по какой-то причине Eclipse копировал файлы из "target/classes".
Таким образом, я изменил свой pom.xml, изменив папку назначения с "m2e-wtp" на "target/classes", например, на код.
Важно: каждый раз, когда вам нужно запустить сборку maven на проекте, вы должны изменить pom, чтобы построить проект.
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-war-plugin</artifactId>
<version>2.4</version>
<configuration>
<failOnMissingWebXml>false</failOnMissingWebXml>
<filters>
<filter>${project.basedir}/src/main/filters/${build.profile.id}/config.properties</filter>
</filters>
<webResources>
<resource>
<filtering>true</filtering>
<directory>${project.basedir}/src/main/resources</directory>
<targetPath>${project.basedir}/target/classes</targetPath>
<includes>
<include>*.properties</include>
<include>*.xml</include>
<include>META-INF/spring/*.xml</include>
</includes>
</resource>
</webResources>
</configuration>
</plugin>
Ответ 6
Сегодня у меня была аналогичная проблема, когда несколько банок были включены в войну. Я включил фильтрацию и сравнил исходные банки с фильтром. Они кажутся такими же, но это не так. Я попытался переименовать jar в zip, и я не смог распаковать содержимое из-за поврежденной структуры внутри jar (zip), тогда как исходный был в порядке. Здесь также упоминается добавление фильтрующих веб-ресурсов, где сказано, что для фильтрации необходимо установить значение false, чтобы предотвратить повреждение ваших двоичных файлов.