在 Java 8 上设置 maven 单元测试的时区

2022-09-01 05:48:56

如何在Java 8上的maven surefire中设置单元测试的时区?

在Java 7中,这曾经像在以下配置中一样工作,但在Java 8中,测试仅使用系统时区。systemPropertyVariables

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

为什么会这样,我该如何解决?


答案 1

简短的回答

Java 现在读取得更早,在 surefire 设置 中的属性之前。解决方案是使用以下命令将其设置得更早:user.timezonesystemPropertyVariablesargLine

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

长答案

Java 初始化默认时区,考虑它第一次需要它的时间,然后将其缓存在 中。现在,在读取 jar 文件时已经发生了这种情况:现在调用会创建一个初始化默认时区的实例。这不是一个特定于肯定的问题。有人称它为JDK7中的一个错误。此程序以前以 UTC 格式打印时间,但现在使用系统时区:user.timezonejava.util.TimeZoneZipFile.getZipEntryZipUtils.dosToJavaTimeDate

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 TimeZoneTestTimeZone.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>

答案 2

推荐