Подтвердить что ты не робот

Как настроить локальный часовой пояс Maven на maven.build.timestamp?

В Maven 3.2.2+ параметр maven.build.timestamp был переопределен, чтобы показать время в UTC, согласно MNG-5452.

Есть ли способ указать, что я хочу информацию о часовом поясе в своем локальном часовом поясе, а не в UTC? Я кратко просмотрел источники maven, но не вижу в любом случае указания, что я хочу, чтобы TZ был локальным TZ, а не UTC.

4b9b3361

Ответ 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 в свой часовой пояс.