[英]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
我已經嘗試了一些東西(徒勞),問題似乎並不在於代碼本身:
main
中添加了Locale.setDefault(Locale.GERMANY)
。 Locale.getDefault()
將顯示德語語言環境,但沒有效果。-Duser.country=DE
和-Duser.language=de
。 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
運行 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
進行比較以確認。 然后考慮使用包含jlink
的jdk.localedata
制作一個圖像,如果它缺少測試這個假設。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.