4

我想使用ResourceBundle类来检索我的应用程序的语言环境特定的文本,但遇到一些错误。指定Java本地化文件

java.lang.ClassCastException: org.project.MyClass cannot be cast to ResourceBundle 

java.util.MissingResourceException: Can't find bundle for base name org.project.MyClass, locale en_US 

的代码,我使用的是创建资源包如下:

static final ResourceBundle i18ln = ResourceBundle.getBundle("org.project.MyClass", Locale.getDefault()); 

...我已经寻找如何与没有成功指定资源文件的位置大约一个小时。我的项目设置如下:

 
project-folder/ 
    src/ 
     org/ 
      project/ 
       MyClass.java 
    test/ 
    lib/ 
    res/ 
     images/ 
     org/ 
      project/ 
       MyClass.properties 

我的项目的结构是否与Java ResourceBundle的结构不兼容?有谁知道我可以如何让这个工作?

回答

4

是MyClass.java某种ResourceBundle的子类吗?我怀疑它不是,因此ClassCastException。

如果MyClass不是ResourceBundle类型,那么尝试将MyClass.properties重命名为MyResource.properties之类的其他东西,然后将res目录放在classpath中以查找资源包。请确保您使用ResourceBundle.getResource像这样的时候改变你的资源的名称:

static final ResourceBundle i18ln = ResourceBundle.getBundle("org.project.MyResource", Locale.getDefault()); 
+0

保持资源属性文件与类名称相同的一点是保持特定于该类的本地化文本约定。 – 2011-04-17 14:45:42

+0

您是否尝试将您的属性文件放在您的类路径中?这本身就能解决你的问题。 – buruzaemon 2011-04-17 14:48:38

+0

第一次读到你的答案时没有发现。将_res_文件夹添加到类路径中的确行得通!谢谢。 – 2011-04-17 14:59:59

0

你有res文件夹MyClass.properties。将MyClass.properties复制到src文件夹中,它应该可以工作。

+0

这不是我想要我的项目设置。这是使ResourceBundle工作的唯一方法吗? – 2011-04-17 14:43:35

2

ResourceBundle将在尝试加载属性文件之前尝试实例化名为org.project.MyClass的类。曾几何时,人们将代码编译到具体的类中是相当正常的,但您不再经常看到它。

资源包的文档在the javadoc中描述。

  • 首先,它尝试使用候选包 名加载类。如果这样的类可以发现 ,并使用指定的类 加载器加载的,是分配与 的ResourceBundle兼容,是从 资源包访问,并且可以 实例化,那么getBundle创建此类的新 实例,并使用它作为 结果资源包。
  • 否则,getBundle会尝试查找属性资源文件。它 通过替换所有 “。”从 候选软件包名称生成路径名称。带“/”的字符,并附加 字符串“.properties”。它尝试使用ClassLoader.getResource尝试 以找到名称为 的“资源”。 (注意 “ getResource”中的“资源”与资源包的内容无关,它只是一个容器中的数据,如 文件。)如果它发现“资源” ,它 尝试从 其内容创建一个新的 PropertyResourceBundle实例。如果成功,此 实例将成为结果资源 捆绑包。

如果没有结果资源包已经 发现,MissingResourceException异常是 抛出。

按照惯例,很多项目都会解决属性文件的相关包名。例如,包foo.bar将为l10n资源附带foo.bar.nls包。

0

当属性文件和类的大小写不匹配时,也会发生此问题。例如:MyClass.javamcyclass.properties

这似乎是平台特定的;在我的情况下,我可以在我的Mac上本地构建,但是当推送到Team City Linux构建代理时,构建失败,出现异常。