Как получить доступ к maven.build.timestamp для фильтрации ресурсов
Я использую maven 3.0.4 и хочу сделать метку времени сборки доступной для моего приложения. Для этого я помещаю placeholder в файл .properties
и разрешаю фильтр maven при сборке. Хотя это работает отлично для ${project.version}
, ${maven.build.timestamp}
не подставляется при фильтрации.
Свойство, похоже, доступно для сборки - я могу использовать его для изменения имени артефакта:
<finalName>${project.artifactId}-${maven.build.timestamp}</finalName>
Так почему он недоступен для фильтрации ресурсов? И, что более важно, как мне сделать доступным?
Ответы
Ответ 1
Я обнаружил эту статью, объяснив, что из-за ошибки в maven, timestamp сборки не распространяются на фильтрацию. Обходной путь состоит в том, чтобы обернуть метку времени в другое свойство:
<properties>
<timestamp>${maven.build.timestamp}</timestamp>
<maven.build.timestamp.format>yyyy-MM-dd HH:mm</maven.build.timestamp.format>
</properties>
Фильтрация работает, как ожидается, для
buildTimestamp=${timestamp}
Ответ 2
Чтобы обогатить контент Stackoverflow для других, я, как и я, нашел этот пост как способ решить "проблему" ${maven.build.timestamp}
. Это не ошибка maven, а ожидаемое поведение m2e, как это видно в этот пост.
Поэтому я считаю, что мы не можем ожидать, что решение будет "исправлено", поскольку, насколько я понимаю, исправление связано с концептуальными проблемами.
В моем случае я использовал плагин (buildnumber-maven-plugin
), как описано в этом другом сообщении.
Ответ 3
Я могу подтвердить, что с Maven 3.x {maven.build.timestamp}
сейчас "работает". Видимо, они работают над этой проблемой. Никаких дополнительных properties
больше не требуется.
Однако, будьте осторожны, ваш плагин "фильтрации" (maven-resources-plugin) обновлен. Он должен быть относительно новым, поэтому, если mvn help:effective-pom
показывает старую версию (например, 2.6), увеличьте ее до чего-то более нового, исправьте для меня 3.x ex:
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-resources-plugin</artifactId>
<version>3.1.0</version>
</plugin>
<properties><timestamp>...
обходной путь больше не требуется...
Это также прояснило, почему-то, почему он работал в IntelliJ, а не в командной строке. IntelliJ, вероятно, использует свои собственные "модифицированные/внутренние" константы maven, поэтому он работал там, но не из командной строки maven.
Также обратите внимание, что если вы добавляете каталог ресурсов фильтрации в ваш pom, вам может понадобиться также "повторно добавить" каталог по умолчанию, он теряется, например:
<resource>
<directory>src/main/resources-filtered</directory> <!-- to get "maven.build.timestamp" into resource properties file -->
<filtering>true</filtering>
</resource>
<resource>
<directory>src/main/resources</directory> <!-- apparently have to add this is you have the other... -->
</resource>
Примечание: если вы используете весеннюю загрузку в качестве родителя, вы должны использовать вместо этого @maven.build.timestamp @. Также обратите внимание, что если вы используете весеннюю загрузку, существует файл META-INF/build-info.properties
который, необязательно, создается spring-boot-maven-plugin
который вы можете прочитать (для удобства чтения BuildProperties
предоставляет BuildProperties
компонент BuildProperties
).
Ответ 4
Добавление свойств Maven на уровне проекта pom не учитывает правильный локальный часовой пояс, поэтому временная метка может отображаться неправильно:
<properties><timestamp>${maven.build.timestamp}</timestamp></properties>
Использование модуля build-helper-maven-plugin применяет правильный часовой пояс и текущее летнее время к временной метке:
<build>
<plugins>
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>build-helper-maven-plugin</artifactId>
<version>1.9.1</version>
<executions>
<execution>
<id>timestamp-property</id>
<goals>
<goal>timestamp-property</goal>
</goals>
<configuration>
<name>timestamp</name>
<pattern>yyyy-MM-dd HH:mm:ss</pattern>
<timeZone>Europe/Zurich</timeZone>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
<resources>
<resource>
<directory>src/main/resources</directory>
<filtering>true</filtering>
</resource>
</resources>
</build>
При упаковке Maven заменит любую метку времени в папке /resources, например resources/version.properties:
build.timestamp = $ {} Отметка времени
Затем вы можете загрузить этот файл свойств в вашем приложении.