我正在決議代表德國式數字的字串(即,十進制逗號和可選的句號用于分組千位),例如,“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 找到。
uj5u.com熱心網友回復:
檢查運行時映像中包含哪些模塊。
例如,當我java --list-modules在 JDK 17 上運行時,我注意到這個模塊:
jdk.localedata
我不知道這是否需要它,但我敢打賭,除非特別要求,否則 jpackage 不會包含該模塊。
運行./app/build/jpackage/app/lib/runtime/bin/java --list-modules并比較~/.gradle/jdks/jdk-17 35/bin/java --list-modules 以確認。然后考慮用jlink包含的影像制作一個影像,jdk.localedata如果它缺失來測驗這個假設。
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/360963.html
