Фильтрация веб-ресурсов с помощью плагина 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, а затем он работал

enter image description here


у меня была похожая проблема с фильтрацией интернета.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>