Как получить доступ к maven.build.timestamp для фильтрации ресурсов

Я использую maven 3.0.4 и хотел бы сделать метку времени сборки доступной для моего приложения. Для этого я помещаю заполнитель в .properties файл и пусть maven фильтр при сборке. Пока это работает нормально для ${project.version}, ${maven.build.timestamp} не подставляется при фильтрации.

Похоже, что свойство доступно при сборке - я могу использовать его для изменения имени артефакта:

<finalName>${project.artifactId}-${maven.build.timestamp}</finalName>

Так почему же он не доступен для фильтрации ресурсов? И, что более важно, как я могу сделать это доступным?

3 ответа

Решение

Я обнаружил эту статью, объясняющую, что из-за ошибки в maven метка времени сборки не распространяется на фильтрацию. Обходной путь должен обернуть метку времени в другое свойство:

<properties>
   <timestamp>${maven.build.timestamp}</timestamp>
   <maven.build.timestamp.format>yyyy-MM-dd HH:mm</maven.build.timestamp.format>
</properties>

Фильтрация тогда работает как ожидалось для

buildTimestamp=${timestamp}

Начиная с Maven 3.x, я могу подтвердить, что сейчас это "по крайней мере работает". Видимо, они работают на этом.

Однако, будьте осторожны, ваш плагин "фильтрации" обновлен. Это должно быть относительно новым, так что если mvn help:effective-pom показывает старую версию (например: 2.6), поднял ее на что-то более новое, исправил ее для меня, 3.x, например:

<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>

Для того, чтобы обогатить контент Stackru для других, кто, как и я, нашел этот пост как способ решения "проблемы" ${maven.build.timestamp}, Это не ошибка Maven, а ожидаемое поведение m2e, как можно увидеть в этом посте.

Поэтому я считаю, что мы не можем ожидать, что решение будет "исправлено", поскольку, насколько я понимаю, исправление связано с концептуальными проблемами.

В моем случае я использовал плагин (buildnumber-maven-plugin), как описано в этом другом посте.

Добавление свойств 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 = $ {} Отметка времени

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

Другие вопросы по тегам