Joda-time 2.9.9更新tzdata遇FileNotFoundException问题求助
解决方案:不升级Joda-Time 2.9.9更新tzdata并解决启动异常
问题根源
报错核心是Joda-Time的ZoneInfoProvider读取时区数据时,要么找不到ZoneInfoMap文件,要么误将目录当作文件读取。这是因为手动解压tzdata包后的目录结构不符合Joda-Time预期,或者时区数据路径配置错误导致的。
具体操作步骤
1. 正确处理tzdata2023c包
- 解压下载的tzdata2023c.tar.gz,取出其中的
zoneinfo目录(这是IANA时区数据的标准目录,包含ZoneInfoMap和所有时区文件) - 将
zoneinfo目录直接重命名为tzdata2023c,放到/tmp/tz/路径下,确保最终路径为/tmp/tz/tzdata2023c/ZoneInfoMap(此处ZoneInfoMap是文件而非目录)
2. 强制指定Joda-Time时区数据路径
Joda-Time 2.9.9支持通过系统属性指定时区数据加载路径,避免默认路径错误:
- 在Weblogic启动参数中添加:
该参数会让Joda-Time强制从指定目录加载时区数据,覆盖默认查找逻辑。-Dorg.joda.time.tz.DefaultZoneInfoProvider=/tmp/tz/tzdata2023c
3. 检查文件权限与旧数据清理
- 确保Weblogic运行用户对
/tmp/tz/tzdata2023c目录及内部文件有读权限 - 删除
/tmp/tz/下的旧时区数据目录(如tzdata2020a),避免Joda-Time误加载旧数据
4. 生产环境持久化方案(替代临时目录)
如果/tmp目录重启后会被清理,建议将时区数据打包成jar包持久化:
- 将重命名后的
tzdata2023c目录打包为joda-tzdata-2023c.jar,确保jar包根目录下直接是ZoneInfoMap和时区文件 - 将该jar包放入Weblogic的
domain/lib目录,或添加到应用类路径中。Joda-Time会自动扫描类路径中的时区数据jar包,优先使用最新版本
验证方法
启动Weblogic后,可通过以下代码验证时区数据是否更新:
import org.joda.time.DateTimeZone; import org.joda.time.LocalDateTime; public class TzValidation { public static void main(String[] args) { DateTimeZone shanghaiZone = DateTimeZone.forID("Asia/Shanghai"); LocalDateTime currentTime = LocalDateTime.now(shanghaiZone); System.out.println("时区ID: " + shanghaiZone.getID()); System.out.println("当前时间: " + currentTime); // 可进一步验证夏令时切换规则等更新内容 } }
内容的提问来源于stack exchange,提问作者pancho
相关产品推荐
相关产品推荐

