Фильтрация веб-ресурсов с помощью плагина Maven war не работает в Eclipse с m2e - PullRequest
22 голосов
/ 21 марта 2012

Я пытаюсь отфильтровать файл конфигурации 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.

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

Ответы [ 6 ]

26 голосов
/ 22 марта 2012

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

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

9 голосов
/ 27 января 2014

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

1 голос
/ 21 марта 2012

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

0 голосов
/ 29 октября 2015

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

0 голосов
/ 24 июля 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>
0 голосов
/ 17 июля 2014

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

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

<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>

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

...