Это немного сводит с ума, и я никогда не видел, чтобы это случалось раньше за несколько лет работы с 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 делал что-то с перерывами, поэтому я беспокоился, что он снова сломается. Любые мысли будут оценены.