Как получить доступ к 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 = $ {} Отметка времени

Затем вы можете загрузить этот файл свойств в вашем приложении.