我维护一个applet,帮助用户将照片上传到我们的服务.applet jar文件有几个.properties文件:
>> jar -tf applet.jar | grep prop
res/messages.properties
res/messages_ca.properties
res/messages_es.properties
...
Run Code Online (Sandbox Code Playgroud)
这些是在applet初始化期间加载的.
messages = ResourceBundle.getBundle("res.messages");
Run Code Online (Sandbox Code Playgroud)
然而,此调用会向服务器生成4到5个请求,以查找不在jar文件中的文件,然后再返回到.properties包含在文件中的文件.jar.
从服务器错误日志:
[error] File does not exist: /photos/res/messages.class
[error] File does not exist: /photos/res/messages_en.class
[error] File does not exist: /photos/res/messages_en.properties
[error] File does not exist: /photos/res/messages_en_US.class
[error] File does not exist: /photos/res/messages_en_US.properties
Run Code Online (Sandbox Code Playgroud)
ResourceManager.getBundle的文档解释了这是它的完成方式:
然后,getBundle迭代候选bundle名称,找到第一个可以实例化实际资源包的名称.对于每个候选包名称,它会尝试创建资源包:
首先,它尝试使用候选包名称加载类.如果可以使用指定的类加载器找到并加载这样的类,与ResourceBundle兼容的赋值,可以从ResourceBundle访问,并且可以实例化,则getBundle创建此类的新实例并将其用作结果资源包.
否则,getBundle会尝试查找属性资源文件.它通过替换所有"."从候选包名称生成路径名.带有"/"的字符并附加字符串".properties".它尝试使用ClassLoader.getResource查找具有此名称的"资源".
我确信这样做是有充分理由的,但在我看来,对于我来说,对于已知在服务器上不存在的文件应该有五个失败的请求似乎是浪费的.
有没有办法教applet .jar只在文件中查找这些文件?
注意:我不是Java程序员,所以如果有更好的方法来加载属性ResourceManager.getBundle,请告诉我.