Han*_*ans 5 java locale gradle jpackage
我正在解析表示德语风格数字的字符串(即,小数逗号和用于对千进行分组的可选句号),例如“2.804,13”;这只是使用DecimalFormat基于我的期望来完成的Locale:
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
但是,当我将其捆绑为 jpackage 映像(./gradlew jpackageImage使用 Gradle 和Badass Runtime Plugin)并运行生成的二进制文件时,输出似乎表明使用了错误的区域设置:
2.815,53    -> 2.815
2815,53     -> 281553
我尝试了一些东西(徒劳),问题似乎并不在于代码本身:
Locale.setDefault(Locale.GERMANY)在main. Locale.getDefault()将显示德语区域设置,但没有任何效果。-Duser.country=DE和-Duser.language=de通过 Java 命令行参数System.getProperty(...)显示预期值,但同样没有效果。(此外,从命令行,它也可以将这些设置为系统默认值。)-Djava.locale.providers=COMPAT,CLDR,SPI到 jpackage Java 命令行参数(来自此线程)。再次,我可以从main属性设置是否正确,但这没有什么区别。(无论如何,这似乎是早期 Java 版本的一个问题。)我首先使用Java 16 和 Gradle 7.2看到了这个问题;并且在更新后它仍然存在Java 17 和 Gradle 7.3后它仍然存在。该问题在英语 Linux 系统和德语 Windows 机器上都出现过。
使用--info该jpackageImage命令,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/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在打包时会忽略区域设置?我是否在这里遗漏了一些东西,或者这可能是 jpackage 或插件中的错误,或者 Java 版本本身的错误?
整个 Gradle 示例项目(非常小)可以在 Github 上找到。
检查运行时映像中包含哪些模块。
例如,当我java --list-modules在 JDK 17 上运行时,我注意到这个模块:
jdk本地数据
我不知道这是否是必需的,但我敢打赌,除非特别要求,否则 jpackage 不会包含该模块。
运行./app/build/jpackage/app/lib/runtime/bin/java --list-modules并比较~/.gradle/jdks/jdk-17+35/bin/java --list-modules  以确认。jlink然后考虑制作一张包含jdk.localedata是否缺失的图像来检验这个假设。
| 归档时间: | 
 | 
| 查看次数: | 550 次 | 
| 最近记录: |