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 порядок составляет compile->test->package. Поэтому, чтобы принудительно фильтровать ресурсы на двух этапах, которые вызывали у меня головную боль, я настроил плагин ресурсов для запуска как на этапе компиляции, так и на этапе тестирования:
<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>
Кажется, это работает последовательно, но я до сих пор не понимаю, почему мне нужно было сделать это для одного проекта из десятков, над которыми я работал в последние несколько лет. Я никогда раньше не видел, чтобы Мэйвен что-то делал с перерывами, и я беспокоился, что это снова сломается. Любые мысли будут оценены.
1 ответ
Как Тейлор написал в комментарии выше:
Вы запускаете затмение или что-то подобное одновременно? Это может быть перезапись maven-фильтрованного ресурса в попытке быть "полезной".
Проблема в бегущем затмении. В зависимости от вашей конфигурации eclipse (m2e yes/no), eclipse просто перезапишет ваши файлы ресурсов, как только решит обновить ваш проект.
Эту проблему можно решить с помощью интеграции Eclipse Maven (в отличие от eclipse: eclipse), которая корректно фильтрует ресурсы "на лету".
Или, конечно же, остановив затмение во время строительства, что на самом деле невозможно в качестве модели рабочего процесса.