我正在开发一个在Java 1.5上编译的applet应用程序(与1.5+兼容)。 它包含一些资源属性文件,这些文件捆绑在同一个jar中,与Java包并行。
每当我通过applet访问该资源文件时,它就会向下载applet的服务器发出请求。之后,它从jar中读取文件并按原样运行,但我不希望它为这些文件发出服务器请求。
这是我的java代码访问资源文件的方式。
ResourceBundle messages = ResourceBundle.getBundle("resources/properties/Messages", locale);
我尝试了两种方式访问:
ResourceBundle messages = ResourceBundle.getBundle("resources.properties.Messages", locale);
两者都有相同的行为。
注意:这些资源在我的网络应用中不是可用的松散资源。
答案 0 :(得分:5)
我从服务器日志中获取了这些详细信息。我正在分析我的服务器日志中的404和500个响应..
404(未找到)&可能会出现500(服务器错误)消息,因为插件正在尝试检查缓存的资源是否是最新的。为此,它需要检查上次更新资源的服务器版本的时间。
复杂因素是资源可能位于applet 或 的archive
属性中提到的Jar中,它可以是'松散文件'与指定的codebase
在同一路径上。因此,如果资源位于Jar的以下路径中:
/resources/properties/Messages_en_US.properties
JVM也将检查
${codebase}/resources/properties/Messages_en_US.properties
以及每个Jar。
要修复它们,请参阅codebase_lookup
参数。这个用例需要:
<param name='codebase_lookup' value='false' >
告诉JVM在类路径中存储了 no 资源作为松散文件,并且只搜索Jars。它应该停止经常报告的404
/ 500
消息(对于了解该参数的新JRE)。
答案 1 :(得分:0)
我不太了解Java Plug-in缓存applet的内部细节,但如果你的applet使用.jnlp描述符,我会尝试将download="eager"
添加到描述符的{{1} } element。
您也可以尝试将ResourceBundles定义为类而不是.properties文件。例如:
<jar>
就像属性文件一样,您可以根据需要为多个语言环境定义它们:
package resources.properties;
import java.util.ListResourceBundle;
public class Messages
extends ListResourceBundle {
protected Object[][] getContents() {
return new Object[][] {
{"entry1", "Some message text"},
{"entry2", "A different message"},
// etc.
};
}
}
如果您定义ResourceBundle子类,最好删除相应的.properties文件。