Ответ 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>