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

Java程序经jpackage打包后Locale失效 德式数字解析错误

问题描述

我需要解析德式格式的数字字符串:规则为逗号作为小数分隔符,圆点可选作为千位分隔符,示例格式为"2.804,13"。目前我是基于指定Locale通过DecimalFormat实现解析,代码如下:

package loc_test;

import java.text.DecimalFormat;
import java.text.NumberFormat;
import java.util.Locale;

public class ParseNumbers {
    static final DecimalFormat df = (DecimalFormat) NumberFormat.getNumberInstance(Locale.GERMANY);

    public static void main(String[] args) throws Exception {
        for (String s : new String[] { "2.815,53", "2815,53" }) {
            System.out.println(String.format("%s \t-> %s", s, df.parse(s)));
        }
    }
}

直接通过命令行编译运行该代码时输出符合预期,结果如下:

2.815,53        -> 2815.53
2815,53         -> 2815.53

但当我通过Gradle配合Badass Runtime Plugin执行./gradlew jpackageImage命令打包为jpackage镜像后,运行生成的二进制文件输出异常,看起来是使用了错误的Locale:

2.815,53    -> 2.815
2815,53     -> 281553

我已尝试多种方案均无效,可排除代码本身问题:

  • 在main方法中添加Locale.setDefault(Locale.GERMANY),打印Locale.getDefault()可确认默认区域已设置为德语区域,但无效果。
  • 通过Java命令行参数显式设置-Duser.country=DE和-Duser.language=de,通过System.getProperty(...)可确认参数已生效,但仍无效果,且命令行运行时即使将这两个参数设为系统默认值也能正常工作。
  • 在jpackage的Java命令行参数中添加-Djava.locale.providers=COMPAT,CLDR,SPI,在main方法中可确认该属性已正确设置,仍无效果,该配置原本被认为是可以解决早期Java版本的同类已知问题。

我最早在Java 16 + Gradle 7.2环境中发现该问题,升级到Java 17 + Gradle 7.3后问题仍然存在,在英文Linux系统和德文Windows设备上均可复现。

为jpackageImage命令添加--info参数后,Gradle输出显示其使用的JDK路径及执行命令如下:

Starting process 'command '.../.gradle/jdks/jdk-17+35/bin/jpackage''. Working directory: .../LocTest/app Command: .../.gradle/jdks/jdk-17+35/bin/jpackage --type app-image --input .../LocTest/app/build/install/app/lib --main-jar app.jar --main-class LocTest.App --dest .../LocTest/app/build/jpackage --name app --runtime-image .../LocTest/app/build/jre --java-options -Duser.country=DE --java-options -Duser.language=de --java-options -Djava.locale.providers=COMPAT,CLDR,SPI

当我直接使用Gradle下载的对应JDK(路径为.gradle/jdks/jdk-17+35/bin/java)运行该类时,执行命令:

~/.gradle/jdks/jdk-17+35/bin/java -cp app/build/classes/java/main loc_test.App

此时问题未复现,数字解析结果正确。
但当我使用jpackage镜像中捆绑的、理论上同源的JRE运行时,执行命令:

./app/build/jpackage/app/lib/runtime/bin/java -cp app/build/classes/java/main/ loc_test.App

问题稳定复现,数字解析结果错误。

请问为什么打包后的Java运行环境会忽略Locale配置?是我遗漏了某个配置项,还是jpackage、对应插件或者Java版本本身存在Bug?


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 13:36:10