Фильтрация веб-ресурсов с помощью плагина 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 никогда не бывает filtered)
Я не могу найти любую полезную документацию по этому вопросу. Я даже не уверен, что он реализован в m2e.
что-то не так с моей конфигурации, или это нереализованная возможность?
6 ответов
Ну, наконец-то я понял.
прежде всего, я сделал то, что указал хмарбез. Я переехала applicationContext.xml в папку ресурсы. War plugin 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
опции в разделе Активация профилей.
Итак, я добавил свой профиль по умолчанию в конфигурацию project Maven, а затем он работал
у меня была похожая проблема с фильтрацией интернета.XML. Я решил проблему, импортировать проект в Eclipse.
причина была коррумпированной /.настройки/орг.затмение.wst.общий.файл компонента. В этом файле определяется порядок файлов, скопированных в каталог развертывания локальных веб-серверов. Например:
<?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>
Если в интернете.XML или application.xml существует в нескольких каталогах, он будет взят из первого найденного каталога. Поэтому его важно это
<wb-resource deploy-path="/" source-path="/target/m2e-wtp/web-resources"/>
это первая запись.
вы найдете больше информации на http://wiki.eclipse.org/M2E-WTP_FAQ В разделе " Что это за папка веб-ресурсов?"
вы пытались поместить ресурсы под src / main/resources/WEB-INF/... вместо и настроил область ресурсов на фильтр ресурсов вместо того, чтобы помещать конфигурацию в местоположение maven не по умолчанию.
у меня просто была аналогичная проблема. Мое решение не элегантно, и я не горжусь этим, но, скажем так, оно приемлемо. В моем случае у меня есть приложение spring boot mvc с приложением swagger (для тестеров для тестирования нашего API). Дело в том, что мы используем это приложение в двух средах, поэтому я создал два профиля - dev и test. В dev env мы хотели бы запустить приложение из eclipse с помощью "run as", поэтому путь контекста пуст (Я знаю, что его можно установить в Spring java config, но это не только заполнитель, который мы хотели бы переключить), и в тестовом env приложение запускается в нашей настроенной версии tomcat... таким образом, путь контекста совпадает с именем файла war.
и вот проблема-swagger вызывает REST docs по этому контекстному пути, и это зависит от профиля 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.
ресурс был отфильтрован, и я видел их в веб-ресурсе в target, но 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>
это не самое удачное решение, потому что оно изменяет код, а не цель, но, по крайней мере, оно работает. Если бы у кого-нибудь были предложения о том, как заставить его работать без изменений кода, я бы очень хотел.
сегодня у меня была аналогичная проблема, когда несколько банок были включены в войну. Я включил фильтрацию и сравнил исходные банки с фильтрованными. Они кажутся одинаковыми, но это не так. Я попытался переименовать jar в zip, и я не смог распаковать содержимое из-за поврежденной структуры внутри jar(zip), тогда как исходный был в порядке. Это также упоминается здесь добавление фильтрации веб-ресурсов где сказано, что фильтрация должна быть установлена false, чтобы предотвратить повреждение вашего двоичного файла файлы.
Я пробовал все описанное выше без успеха. Файлы были отфильтрованы и сгенерированы правильно в папке" m2e-wtp", но по какой-то причине Eclipse копировал файлы из"target/classes".
таким образом, я изменил свой pom.xml, изменяя папку назначения с " m2e-wtp "на" target/classes", как код вперед.
важно: каждый раз, когда вам нужно запустить Maven build on project, вы должны изменить pom, чтобы построить de project.
<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>