ThreeTen toZonedDateTime:由 Ant 构建时出现异常

ThreeTen toZonedDateTime: Exceptions when built by Ant

提问人:Torsten 提问时间:11/5/2014 最后编辑:Torsten 更新时间:11/14/2014 访问量:3254

问:

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

DateTimeUtils.toZonedDateTime(cal);

设置

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

库被放置在一个中心项目中,异常是从引用主项目的项目中引发的。

该异常发生在 ant 构建脚本执行的两个单元测试中。我可以在指定的 jenkins-home/workspace/Trunk/Project/build/project.jar 中看到 threeten lib,还可以在那里看到 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 ...

第2次测试

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)
java 蚂蚁 时区 类路径 threetenbp

评论

0赞 BlueLettuce16 11/5/2014
你的类路径上有所有必需的依赖关系吗?
0赞 Torsten 11/5/2014
@BlueLettuce16 我该如何验证?我想是的,因为在任何 threeten 类的第一次调用中都不会发生异常,在这种情况下是 DateTimeUtils。
0赞 BlueLettuce16 11/5/2014
你从哪里得到这个图书馆?我建议从 github.com/ThreeTen/threetenbp 下载它,然后使用 maven 构建,然后将其放到适当的 lib 目录(父项目)供 Ant 使用。
0赞 Torsten 11/6/2014
@BlueLettuce16 我的同事是从 threeten.org/threetenbp 链接的 mvn 存储库中得到的。但是,我也按照您建议的方式构建了它(v. 1.1),但问题仍然存在。

答:

3赞 Christian Ciach 11/14/2014 #1

如果类路径中有两个或多个 threeTenBP 库,则会出现此问题。即使库文件相同,也会发生这种情况。在我们的例子中,我们包含了两次相同的库,但来自文件系统中的不同路径。

此致敬意 基督教

评论

0赞 StarWind0 9/12/2017
解决方案是?
0赞 Christian Ciach 9/13/2017
显然,删除多余的 jar 文件。
0赞 StarWind0 9/14/2017
我的问题最终来自 multi dex / pro guard 在旧设备上加载库的速度不够快。要求我在库的 proguard 规则中添加保留规则。也就是说,您只说明了根本问题而不是修复程序。显而易见对其他人来说并不总是显而易见的。我发现这个链接有助于帮助改善我自己的答案 stackoverflow.com/help/how-to-answer