Настройка часового пояса для модульных тестов maven на Java 8

Как установить часовой пояс для модульных тестов в maven surefire на Java 8?

В Java 7 это использовалось для работы с systemPropertyVariables, как в следующей конфигурации, но с Java 8 тесты просто используют системный часовой пояс.

<plugin>
  <groupId>org.apache.maven.plugins</groupId>
  <artifactId>maven-surefire-plugin</artifactId>
  <configuration>
    <systemPropertyVariables>
      <user.timezone>UTC</user.timezone>
    </systemPropertyVariables>

Почему это и как его исправить?

Ответ 1

Короткий ответ

Java теперь читает user.timezone раньше, прежде чем surefire установит свойства в systemPropertyVariables. Решение состоит в том, чтобы установить его раньше, используя argLine:

<plugin>
  ...
  <configuration>
    <argLine>-Duser.timezone=UTC</argLine>

Длинный ответ

Java инициализирует часовой пояс по умолчанию, принимая во внимание user.timezone в первый раз, когда это необходимо, а затем кэширует его в java.util.TimeZone. Это теперь происходит уже при чтении файла jar: ZipFile.getZipEntry теперь вызывает ZipUtils.dosToJavaTime который создает экземпляр Date который инициализирует часовой пояс по умолчанию. Это не определенная проблема. Некоторые называют это ошибкой в JDK7. Эта программа раньше печатала время в UTC, но теперь использует системный часовой пояс:

import java.util.*;

class TimeZoneTest {
  public static void main(String[] args) {
    System.setProperty("user.timezone", "UTC");
    System.out.println(new Date());
  }
}

В общем случае решение состоит в том, чтобы указать часовой пояс в командной строке, например, java -Duser.timezone=UTC TimeZoneTest, или установить его программно с помощью TimeZone.setDefault(TimeZone.getTimeZone("UTC")); ,

Полный пример:

  <build>
    <plugins>
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-surefire-plugin</artifactId>
        ... could specify version, other settings if desired ...
        <configuration>
          <argLine>-Duser.timezone=UTC</argLine>
        </configuration>
      </plugin>
    </plugins>
  </build>