Подтвердить что ты не робот

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

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

4b9b3361

Ответ 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, чтобы предотвратить повреждение ваших двоичных файлов.