java - ThreeTen toZonedDateTime : Exceptions when built by Ant

标签 java ant timezone classpath threetenbp

我有一个抛出异常的单元测试,因为它最终调用了

DateTimeUtils.toZonedDateTime(cal);

设置

我们最近才开始在我们的项目中使用 threeten-bp。

该库位于中央项目中,异常是从引用主项目的项目中抛出的。

异常发生在由 ant 构建脚本执行的两个单元测试中。我可以在指定的 jenkins-home/workspace/Trunk/Project/build/project.jar 中看到 threeten 库,我还可以在其中看到 DB 文件。

从 Eclipse 中运行单元测试不会产生任何异常。

第二个堆栈跟踪表明,“已为 TZDB 时区规则版本加载数据:2014c”。调用单元测试使用的是未设置时区的日历,因此我假设使用的是默认时区。

我将日历更改为使用 UTC 时区,现在测试正常运行,没有出现异常。但是,我想知道为什么不能使用本地时间。

堆栈跟踪

第一次测试

java.lang.NoClassDefFoundError: Could not initialize class org.threeten.bp.zone.ZoneRulesProvider
    at org.threeten.bp.ZoneRegion.ofId(ZoneRegion.java:143)
    at org.threeten.bp.ZoneId.of(ZoneId.java:357)
    at org.threeten.bp.ZoneId.of(ZoneId.java:285)
    at org.threeten.bp.DateTimeUtils.toZoneId(DateTimeUtils.java:141)
    at org.threeten.bp.DateTimeUtils.toZonedDateTime(DateTimeUtils.java:103)
    at ...

第二次测试

java.util.ServiceConfigurationError: org.threeten.bp.zone.ZoneRulesProvider: Provider org.threeten.bp.zone.TzdbZoneRulesProvider could not be instantiated: org.threeten.bp.zone.ZoneRulesException: Unable to load TZDB time-zone rules: jar:file:/jenkins-home/workspace/Trunk/Project/build/project.jar!/org/threeten/bp/TZDB.dat
    at java.util.ServiceLoader.fail(ServiceLoader.java:207)
    at java.util.ServiceLoader.access$100(ServiceLoader.java:164)
    at java.util.ServiceLoader$LazyIterator.next(ServiceLoader.java:360)
    at java.util.ServiceLoader$1.next(ServiceLoader.java:428)
    at org.threeten.bp.zone.ZoneRulesProvider.<clinit>(ZoneRulesProvider.java:93)
    at org.threeten.bp.ZoneRegion.ofId(ZoneRegion.java:143)
    at org.threeten.bp.ZoneId.of(ZoneId.java:357)
    at org.threeten.bp.ZoneId.of(ZoneId.java:285)
    at org.threeten.bp.DateTimeUtils.toZoneId(DateTimeUtils.java:141)
    at org.threeten.bp.DateTimeUtils.toZonedDateTime(DateTimeUtils.java:103)
    at ...
Caused by: org.threeten.bp.zone.ZoneRulesException: Unable to load TZDB time-zone rules: jar:file:/var/lib/jenkins/workspace/Virtuelles_Kraftwerk_HEAD/WetterGUIClassic/build/weather-base.jar!/org/threeten/bp/TZDB.dat
    at org.threeten.bp.zone.TzdbZoneRulesProvider.load(TzdbZoneRulesProvider.java:146)
    at org.threeten.bp.zone.TzdbZoneRulesProvider.<init>(TzdbZoneRulesProvider.java:87)
    at java.lang.reflect.Constructor.newInstance(Constructor.java:513)
    at java.lang.Class.newInstance0(Class.java:357)
    at java.lang.Class.newInstance(Class.java:310)
    at java.util.ServiceLoader$LazyIterator.next(ServiceLoader.java:356)

Caused by: org.threeten.bp.zone.ZoneRulesException: Data already loaded for TZDB time-zone rules version: 2014c
    at org.threeten.bp.zone.TzdbZoneRulesProvider.load(TzdbZoneRulesProvider.java:139)

最佳答案

如果类路径中有两个或更多 threetenbp-libraries,就会出现此问题。如果库文件相同,甚至会发生这种情况。在我们的例子中,我们两次包含相同的库,但来自文件系统中的不同路径。

最好的问候, 基督徒

关于java - ThreeTen toZonedDateTime : Exceptions when built by Ant,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26759807/

相关文章:

java - 使用带参数的 HQL 选择表行

android - 将编译器标志添加到标准的 android build.xml

java - System.currentTimeMillis 交换Java软件和Android

java - 使用 AngularJS 和 SPRING 插入数据库

java - 有没有一种通过枚举实现多个比较器的好方法?

java - 在java中从包装器集合中创建原始数组

ant - 从 ditamap 创建 MERGED 文件然后过滤它

java - 使用 Ant 将 Maven 应用程序复制到 Raspberry Pi 时出现 AccessDeniedException

github - 无法下载 tzdbgen jar

mysql - 在 Java ee 应用程序中使用日期时间