在Java 8上设置Maven单元测试的时区
如何在Java 8上的maven surefire中设置单元测试的时区?
在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>
为什么会这样,我该如何解决?
回答:
简短答案
现在user.timezone
,在surefire在中设置属性之前,Java会更早阅读systemPropertyVariables
。解决方案是使用argLine
以下命令进行更早的设置:
<plugin> ...
<configuration>
<argLine>-Duser.timezone=UTC</argLine>
长答案
Java会user.timezone
在 首次
需要时将默认时区考虑在内,然后将其缓存到中java.util.TimeZone
。现在,在读取jar文件时已经发生了这种情况:ZipFile.getZipEntry
现在调用ZipUtils.dosToJavaTime
创建一个Date
实例,该实例初始化默认时区。这不是特定于surefire的问题。有人称它为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>
以上是 在Java 8上设置Maven单元测试的时区 的全部内容, 来源链接: utcz.com/qa/399225.html