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

107

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

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

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

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

Костя
источник

Ответы:

220

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

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

Затем фильтрация работает должным образом для

buildTimestamp=${timestamp}
Костя
источник
1
Просто примечание для других, у меня возникла проблема с этим, потому что я использую Tomcat в Eclipse, и кажется, что он не работает нормально - замена в target/${project}папке в порядке , но в моей конфигурации Actall Tomcat не использует эту папку ...
Betlista 01
3
@Betlista да, интеграция сервера в eclipse, похоже, использует исходный каталог. Это была одна из причин, по которой я отказался от интеграции с eclipse и использовал maven из командной строки.
Костя
1
Учитывая, что в pom есть несколько мест, где мне нужна метка времени, но в разных форматах (например, имя файла и строка времени сборки), как я могу использовать maven.build.timestamp.formatнесколько раз?
Daniel Alder
13
Нет работы. Фильтрация заменяется ${timestamp}буквальной строкой ${maven.build.timestamp}.
Кевин Крамвиде,
1
Если вы используете SpringBoot, вы должны написатьbuildTimestamp=@timestamp@
Жюльен Фениу,
10

Я могу подтвердить, что Maven 3.x {maven.build.timestamp}сейчас "работает". Видимо, они работают над решением проблемы. Больше не propertiesтребуется никакого дополнительного обходного пути.

Однако будьте осторожны, ваш плагин «фильтрации» (maven-resources-plugin) обновлен. Он должен быть относительно новым, поэтому, если 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>

NB, если вы используете весеннюю загрузку в качестве родительского, вы должны использовать вместо этого @ maven.build.timestamp @ . Также обратите внимание, что если вы используете весеннюю загрузку, есть файл, META-INF/build-info.propertiesкоторый необязательно создается с помощью, spring-boot-maven-pluginкоторый вы можете читать (Spring предоставляет BuildPropertiesкомпонент для удобства чтения).

Роджердпак
источник
1
К сожалению, это еще не работает для maven-war-plugin ( <webResources><resource><filtering>) :-( см. MWAR-415 -> так что все равно придется использовать обходной путь
msa
1
Разные плагины по-разному фильтруют. Если вы используете фильтрацию в maven-assembly-plugin v3.3.0, $ {maven.build.timestamp} по-прежнему недоступен напрямую, и вам нужно использовать <properties><timestamp>...обходной путь. См. Также issues.apache.org/jira/browse/MASSEMBLY-603
Cheeso
4

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

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

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

Боб Риверс
источник
Я обнаружил buildnumber-maven-pluginаналогичные проблемы, а именно, что генерируемая переменная доступна только в определенных контекстах, а НЕ при фильтрации. Вы можете или не сможете преодолеть это, возясь с этапом выполнения или целями, но встроенное решение кажется намного проще.
MarkHu
1

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

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

скай
источник