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

JavaFX打包Jar后运行报错java.util.MissingResourceException: 找不到lng资源包

问题根因

报错核心是java.util.MissingResourceException: Can't find bundle for base name lng, locale en_US,本质是你手动打包Jar的时候,多语言资源文件(lng.properties、lng_fr.properties、lng_en.properties等)没有被正确打入Jar的类路径根目录,Jar运行时类加载器找不到对应资源,而IntelliJ运行时会自动把源根/资源根下的文件加入类路径,所以运行正常。

解决步骤
  • 第一步:规范资源文件配置
    首先确认你的多语言文件命名合规:必须有兜底的lng.properties(直接存英文文本作为默认加载内容)、对应法语的lng_fr.properties,如果有针对美式英语的单独配置可以加lng_en_US.properties,没有的话兜底文件会自动生效。
    然后确认资源文件存放位置:如果放在resources目录下,要右键该目录 -> 选择Mark Directory as -> Resources Root,IntelliJ才会把目录下的文件识别为资源文件,编译打包时放到类路径下。如果没有单独的资源目录,直接把properties文件和main、controller包放在同一级源根目录即可。
  • 第二步:修改资源加载代码
    Jar运行时的类加载器和IntelliJ运行时不一致,需要显式指定当前类的类加载器加载资源,修改代码如下:
    // 显式指定类加载器,避免Jar运行时找不到资源
    ResourceBundle resBundle = ResourceBundle.getBundle("lng", Locale.getDefault(), LoginWelcomeScreenController.class.getClassLoader());
    if (Locale.getDefault().getLanguage().equals("fr")) {
        usernameLabel.setText(resBundle.getString("username"));
        passwordLabel.setText(resBundle.getString("password"));
        loginButton.setText(resBundle.getString("login"));
        exitButton.setText(resBundle.getString("exit"));
    }
    
  • 第三步:修正Jar打包配置
    打开File -> Project Structure -> Artifacts,找到你创建的Jar打包配置,切换到Output Layout标签页:
    1. 在Available Elements列表中找到你的项目模块,展开后找到所有lng开头的properties文件
    2. 右键选中这些文件,点击Put into Output Root,确保资源文件会被打到Jar的根路径下,不是被封装到子包中
    3. 保存配置后重新执行Build Artifacts操作
  • 第四步:验证打包结果
    打包完成后用解压软件打开生成的Jar文件,确认所有lng开头的properties文件直接在Jar的根目录下,没有嵌套在其他文件夹中,此时执行java -jar myapp.jar就能正常加载资源。
优化建议
  • 可以去掉代码中的语言判断逻辑,直接所有文本都从ResourceBundle中读取,ResourceBundle会自动匹配当前系统Locale对应的资源文件,找不到就自动加载兜底的lng.properties,代码更简洁容错性更高。
  • 后续打包JavaFX应用推荐用官方的jpackage工具,或者用Maven/Gradle的JavaFX插件自动打包,比手动配置Artifacts不容易出现资源、依赖遗漏的问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 13:54:05