Maven случайным образом не фильтрует ресурсы

Это немного сводит с ума, и я никогда не видел, чтобы это случалось раньше за несколько лет работы с Maven. Один простой проект (который я не писал сам) случайно не сможет фильтровать ресурсы, и я не могу понять, что может быть причиной этого. Я не могу поделиться исходным кодом проекта, но я постараюсь поделиться как можно большей частью POM. Имейте в виду, что проблема не в коде, а в том, что Maven случайным образом решает не фильтровать ресурсы.

Первоначально я настроил это в теге сборки моего POM:

<resources>
  <resource>
    <directory>src/main/resources</directory>
    <filtering>true</filtering>
  </resource>
</resources>

И в моем каталоге src/main/resources у меня есть файл с именем spring-config.xml. В этом файле есть несколько свойств, которые следует заменить свойствами профиля Maven. Я настроил свои профили сборки следующим образом:

<profile>
  <id>stage</id>
  <properties>
    <env.name>STAGE</env.name>
    <db.url>jdbc:oracle:thin:@xxx.xxx.com:1521:xxx</db.url>
  </properties>
</profile>

Для сборки я запускаю эту команду:

mvn clean package -P stage

Теперь этот проект использует Spring и использует ту же конфигурацию Spring для тестирования и выполнения, поэтому контекст будет создавать соединение с базой данных при выполнении тестовых случаев. В большинстве случаев сборка будет завершена, и тестовые случаи будут пройдены. Однако примерно в 1 случае из 10 тестовые примеры завершатся ошибкой, поскольку свойства не были заменены, а Spring пытается подключиться к "${db.url}", а не к "jdbc:oracle:thin:@xxx.xxx.com:1521". :ххх".

Как ни странно, примерно в 9 случаях из 10 у упакованного JAR будет та же проблема, несмотря на то, что он только что прошел тестовые случаи. Я проверил каталог target/classes, и файлы там имеют ту же проблему. Я подумал, что с плагином ресурсов Maven происходит что-то странное в определенный момент жизненного цикла сборки и, возможно, он неправильно перезаписывает файлы.

Мое решение для пластыря

В жизненном цикле Maven порядок компиляции->тест->пакет. Поэтому, чтобы принудительно фильтровать ресурсы на двух этапах, которые доставляли мне головную боль, я настроил плагин ресурсов для запуска как на этапе компиляции, так и на этапе тестирования:

  <plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-resources-plugin</artifactId>
    <version>2.6</version>
    <configuration>
      <encoding>UTF-8</encoding>
    </configuration>
    <executions>
      <execution>
        <id>this-is-silly</id>
        <phase>compile</phase>
        <goals>
          <goal>resources</goal>
        </goals>
      </execution>
      <execution>
        <id>why-must-i-exist</id>
        <phase>test</phase>
        <goals>
          <goal>resources</goal>
        </goals>
      </execution>
    </executions>
  </plugin>

Кажется, это работает последовательно, но я до сих пор понятия не имею, зачем мне нужно было сделать это для одного проекта из десятков, над которыми я работал за последние несколько лет. Я никогда раньше не видел, чтобы Maven делал что-то с перерывами, поэтому я беспокоился, что он снова сломается. Любые мысли будут оценены.


person monitorjbl    schedule 04.12.2013    source источник
comment
какие-либо ссылки на пример проекта, с которым у вас возникли проблемы?   -  person eis    schedule 04.12.2013
comment
Нет, к сожалению. Не могу поделиться этим за пределами компании, по-видимому.   -  person monitorjbl    schedule 04.12.2013
comment
вам нужно сделать упрощенный пример. трудно сказать что-то другое.   -  person eis    schedule 04.12.2013
comment
Вы запускаете затмение или что-то подобное одновременно? Это может быть перезапись ресурса, отфильтрованного maven, в попытке быть полезным.   -  person Taylor    schedule 04.12.2013
comment
Это действительно хорошая идея. У меня действительно он был открыт, пока я работал над этим, но я запускал Maven из командной строки. Я попытаюсь воссоздать проблему.   -  person monitorjbl    schedule 04.12.2013
comment
Ага, это было! Если вы сделаете ответ, я приму его.   -  person monitorjbl    schedule 05.12.2013


Ответы (1)


Как Тейлор написал в комментарии выше:

Вы запускаете затмение или что-то подобное одновременно? Это может быть перезапись ресурса, отфильтрованного maven, в попытке быть «полезным».

Проблема в запуске затмения. В зависимости от вашей конфигурации eclipse (m2e да/нет), eclipse просто перезапишет ваши файлы ресурсов, как только решит обновить ваш проект.

Это можно решить, используя интеграцию Eclipse Maven (в отличие от eclipse:eclipse), которая корректно фильтрует ресурсы «на лету».

Или, конечно, остановив затмение во время сборки, что на самом деле невозможно в качестве модели рабочего процесса.

person blackbuild    schedule 11.12.2013
comment
исправлено путем отключения сборщиков eclipse в настройках проекта. (актуально для затмения марса, неона) - person harvyS; 03.03.2017