Как настроить локальный часовой пояс Maven на maven.build.timestamp?
В Maven 3.2.2+ параметр maven.build.timestamp
был переопределен, чтобы показать время в UTC, согласно MNG-5452.
Есть ли способ указать, что я хочу информацию о часовом поясе в своем локальном часовом поясе, а не в UTC? Я кратко просмотрел источники maven, но не вижу в любом случае указания, что я хочу, чтобы TZ был локальным TZ, а не UTC.
Ответы
Ответ 1
Как уже упоминалось, в текущих версиях Maven (по крайней мере, до версии 3.3. +) свойство maven.build.timestamp
не позволяет переопределять часовые пояса.
Однако, если вы в порядке используете другое имя свойства для своих целей, build-helper-maven-plugin позволяет настраивать собственные временные метки для разнообразных целей. Ниже приведен пример настройки текущей метки времени в EST во время сборки.
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>build-helper-maven-plugin</artifactId>
<version>1.10</version>
<executions>
<execution>
<id>timestamp-property</id>
<goals>
<goal>timestamp-property</goal>
</goals>
<configuration>
<name>build.time</name>
<pattern>MM/dd/yyyy hh:mm aa</pattern>
<locale>en_US</locale>
<timeZone>EST</timeZone>
</configuration>
</execution>
</executions>
</plugin>
Затем вы можете использовать свойство ${build.time}
вместо ${maven.build.timestamp}
, где вам нужна метка времени сборки в вашем предпочтительном часовом поясе.
Ответ 2
Я думаю, что нет чистого решения Maven, но вы можете использовать задачу Ant.
Следуя инструкциям, приведенным в кулинарной книге разработчиков плагинов Maven, вы можете сгенерировать файл filter.properties
с помощью задачи <tstamp>
Ant, В этом элементе вы можете настроить свою метку времени с тем же шаблоном даты/времени, что и класс SimpleDateFormat, а также использовать Класс часовой пояс. Затем вы можете использовать ${build.time}
, по умолчанию он будет использовать ваш часовой пояс.
1) Используйте maven-antrun-plugin
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-antrun-plugin</artifactId>
<executions>
<execution>
<phase>generate-resources</phase>
<goals>
<goal>run</goal>
</goals>
<configuration>
<tasks>
<!-- Safety -->
<mkdir dir="${project.build.directory}"/>
<tstamp>
<format property="last.updated" pattern="yyyy-MM-dd HH:mm:ss"/>
</tstamp>
<echo file="${basedir}/target/filter.properties" message="build.time=${last.updated}"/>
</tasks>
</configuration>
</execution>
</executions>
</plugin>
2) Активировать фильтрацию
<resources>
<resource>
<directory>src/main/resources</directory>
<filtering>true</filtering>
</resource>
</resources>
<filters>
<filter>${basedir}/target/filter.properties</filter>
</filters>
Ответ 3
Нет решения, кроме как обход. Вы случайно использовали maven buildnumber-maven-plugin плагин?
Если это так, вы можете использовать его для создания ревизии для вас и создания метки времени. Эта временная метка будет основана на вашей локальной конфигурации часового пояса java.
Изменить: Тем не менее вопрос о timestamp
, как отметил Дин Шульце, только первый execution
сломает ${buildNumber}
. Чтобы исправить это, вам придется добавить еще одну execution
в вашу конфигурацию, которая создаст buildRevision
. Обновленный пример ниже.
Например: `
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>buildnumber-maven-plugin</artifactId>
<version>1.3</version>
<inherited>true</inherited>
<executions>
<execution>
<id>generate-timestamp</id>
<phase>validate</phase>
<goals>
<goal>create</goal>
</goals>
<configuration>
<format>{0,date,yyyy-MM-dd HH:mm:ss Z}</format>
<items>
<item>timestamp</item>
</items>
<buildNumberPropertyName>buildDateTime</buildNumberPropertyName>
<getRevisionOnlyOnce>true</getRevisionOnlyOnce>
</configuration>
</execution>
<execution>
<id>generate-buildnumber</id>
<phase>validate</phase>
<goals>
<goal>create</goal>
</goals>
<configuration>
<revisionOnScmFailure>0</revisionOnScmFailure>
<useLastCommittedRevision>true</useLastCommittedRevision>
<buildNumberPropertyName>buildRevision</buildNumberPropertyName>
</configuration>
</execution>
</executions>
Чем вы можете использовать ${buildDateTime}
, где вы хотите ввести переменную timestamp. Другое исполнение с той же целью сохранит и вашу ревизию.
Ответ 4
Обходной путь не требуется.
Информация META-INF о компиляции jar
или war
, специально Build-Date
будет всегда в UTC - это системное время.
Если вы показываете информацию пользователю в пользовательском интерфейсе - используйте его настройки/настройки Locale
и преобразуйте время UTC в свой часовой пояс.