You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Java中通过System.setProperty修改java.locale.providers不生效求助

Java 9+(Java 21)中编程设置java.locale.providers不生效的原因及解决办法

在Java 9+(当前使用Java 21)环境下,通过JVM启动参数-Djava.locale.providers=COMPAT,SPI可以正常修改locale providers,但在Web应用的ServletContextListener#contextInitialized方法中调用System.setProperty设置该属性时,设置完全不生效。

相关代码示例

有效的启动参数配置

-Djava.locale.providers=COMPAT,SPI

无效的编程式设置代码

System.setProperty("java.locale.providers", "COMPAT,SPI");

Web应用中的监听器代码

@WebListener
public class StartUp implements ServletContextListener {

    @Override
    public void contextInitialized(ServletContextEvent event) {
        System.setProperty("java.locale.providers", "COMPAT,SPI"); 
    }
}

原因分析

java.locale.providers是JVM启动阶段就会读取并完成初始化的系统属性,Locale相关的服务提供方加载逻辑在JVM启动初期就已经执行完毕。当Web应用的contextInitialized方法触发时,JVM早已完成了Locale providers的加载流程,此时修改该系统属性无法触发重新加载,自然不会生效。

解决办法

  • 只能在JVM启动阶段配置:必须通过JVM启动参数-Djava.locale.providers=COMPAT,SPI来设置该属性,确保JVM初始化时就能读取到配置。
  • 若使用Web容器(如Tomcat)部署应用,可在容器的启动脚本中添加该参数到JAVA_OPTS变量,或修改容器的配置文件来注入启动参数。

内容的提问来源于stack exchange,提问作者Alireza Fattahi

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.22 05:52:32