簡體   English   中英

Java 程序在 jpackage 時使用了錯誤的語言環境

[英]Java program uses wrong locale when jpackaged

我正在解析表示德式數字的字符串(即,十進制逗號和用於分組數千的可選句號),例如“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)));
        }
    }
}

這給出了所需的 output,例如,當從命令行編譯和運行時:

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

但是,當我將它捆綁為 jpackage 映像(使用 Gradle 和Badass Runtime Plugin./gradlew jpackageImage )並運行生成的二進制文件時,output 似乎表明使用了錯誤的語言環境:

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

我已經嘗試了一些東西(徒勞),問題似乎並不在於代碼本身:

  1. main中添加了Locale.setDefault(Locale.GERMANY) Locale.getDefault()將顯示德語語言環境,但沒有效果。
  2. 通過 Java 命令行參數顯式設置-Duser.country=DE-Duser.language=de System.getProperty(...)顯示預期值,但同樣沒有效果。 (此外,從命令行,它也可以將這些設置為系統默認值。)
  3. -Djava.locale.providers=COMPAT,CLDR,SPI添加到 jpackage Java 命令行參數(來自此線程)。 同樣,我可以從main驗證屬性設置是否正確,但這沒有區別。 (無論如何,早期的 Java 版本似乎一直存在問題。)

我首先使用Java 16 和 Gradle 7.2看到了這個問題; 並且在更新到Java 17 和 Gradle 7.3后它仍然存在。 該問題出現在英語 Linux 系統和德語 Windows 機器上。

--infojpackageImage命令一起使用,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運行 class 時,即運行:

~/.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 找到

檢查運行時映像中包含哪些模塊。

例如,當我在 JDK 17 上運行java --list-modules時,我注意到這個模塊:

jdk.localedata

我不知道這是否需要它,但我敢打賭,除非特別要求,否則 jpackage 不會包含該模塊。

運行./app/build/jpackage/app/lib/runtime/bin/java --list-modules並與~/.gradle/jdks/jdk-17+35/bin/java --list-modules進行比較以確認。 然后考慮使用包含jlinkjdk.localedata制作一個圖像,如果它缺少測試這個假設。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM