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

К сожалению, при горячем развертывании веб-приложения в Tomcat 6 с Eclipse WTP и m2e он всегда выбирает нефильтрованную версию applicationContext.xml. (Файл applicationContext.xml в папке target / m2e-wtp / web-resources / WEB-INF / context никогда не фильтруется)

Я не могу найти никакой полезной документации по этому вопросу. Я даже не уверен, реализовано ли это в m2e.

Что-то не так с моей конфигурацией или это нереализованная функция?


person Juan Calero    schedule 21.03.2012    source источник
comment
Наиболее идеальное решение - stackoverflow.com/ вопросы / 1782352 /   -  person Tharaka    schedule 01.02.2014


Ответы (6)


Ну вот наконец-то я понял.

Прежде всего, я сделал то, что указал Хмарбайсе. Я переместил applicationContext.xml в папку ресурсов. Плагин War 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 проекта, и тогда он сработал.

введите описание изображения здесь

person Juan Calero    schedule 22.03.2012

У меня была аналогичная проблема с фильтрацией 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 в разделе «Что это папка веб-ресурсов? "

person insideout    schedule 27.01.2014

Вы пытались поместить ресурсы в src / main / resources / WEB-INF / ... вместо и настроили область ресурсов на фильтруйте ресурсы вместо того, чтобы помещать конфигурацию в расположение maven, отличное от заданного по умолчанию.

person khmarbaise    schedule 21.03.2012
comment
Вы имеете в виду перемещение applicationContext.xml или файлов конфигурации? В первом случае я полагаю, что смогу это сделать, но как я скажу Maven скопировать файл по правильному целевому пути? Кроме того, мой основной файл конфигурации Spring не будет находиться в предполагаемом месте в проекте, а это не интуитивно понятно. Во втором случае я могу переместить туда свои файлы конфигурации, но тогда эти файлы будут скопированы в целевую войну, не так ли? и это не то, что я хочу (эти свойства предназначены только для фильтрации Maven, они не нужны во время выполнения) - person Juan Calero; 21.03.2012
comment
Файлы фильтров могут быть расположены в другой папке, чем src / main / resources, например src / main / filter? Кроме того, applicationContext.xml должен находиться в src / main / resources / WEB-INF / ..? - person khmarbaise; 21.03.2012

У меня была похожая проблема. Мое решение не изящно, и я им не горжусь, но, допустим, приемлемо. В моем случае у меня есть приложение Spring Boot mvc с приложением swagger (для тестировщиков, которые тестируют наш API). Дело в том, что мы используем это приложение в двух средах, поэтому я создал два профиля - dev и test. В dev env мы хотели бы запускать приложение из eclipse, просто «запустить от имени», чтобы путь контекста был пустым (я знаю, что его можно установить в конфигурации spring java, но это не единственный заполнитель, который мы хотели бы переключить) и в test env приложение запускается в нашей настроенной версии tomcat ... поэтому путь контекста совпадает с именем файла war.

и вот проблема - чванство вызывает остальные документы на этом пути контекста, и это зависит от профиля пружины. Итак, у нас есть веб-ресурс, который нужно отфильтровать. Сначала попробовал использовать фильтрацию 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, он не работал с «запускать от имени» из 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>

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

person Piotr Tempes    schedule 17.07.2014

У меня сегодня была аналогичная проблема, когда несколько банок были включены в войну. Я включил фильтрацию и сравнил исходные банки с фильтрованными. Они кажутся одинаковыми, но это неправда. Я попытался переименовать jar в zip, и мне не удалось распаковать содержимое из-за поврежденной структуры внутри jar (zip), тогда как исходный был в порядке. Здесь также упоминается добавление фильтрующих веб-ресурсов где сказано, что для фильтрации нужно установить false, чтобы предотвратить повреждение ваших двоичных файлов.

person Michal    schedule 29.10.2015

Все описанное выше я пробовал безуспешно. Файлы были отфильтрованы и сгенерированы правильно в папке «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>
person Cristiano De Magalhães Almeida    schedule 24.07.2015
comment
Em português: Tentei todas as respostas, para mim nenhuma funcionou. Os arquivos eram filtrados e gerados corretamente na pasta m2e-wtp, porém por algum motivo или Eclipsecontinava pegando os arquivos filtrados diretamente do target / classes. что это за язык? - person VeKe; 24.07.2015