1

我正在开发一个在 Java 1.5(与 1.5+ 兼容)上编译的小程序应用程序。它包含一些资源属性文件,这些文件捆绑在同一个 jar 中,与 Java 包平行。

每当我通过小程序访问该资源文件时,它都会向下载小程序的服务器发出请求。之后,它从 jar 中读取文件并像以前一样工作,但我不希望它对这些文件发出服务器请求。

这就是我的 java 代码访问资源文件的方式。

ResourceBundle messages = ResourceBundle.getBundle("resources/properties/Messages", locale);

我尝试了两种方式的访问:

ResourceBundle messages = ResourceBundle.getBundle("resources.properties.Messages", locale);

两者都有相同的行为。

注意:这些资源在我的 Web 应用程序中不能作为松散资源使用。

4

2 回答 2

5

我从服务器日志中获得了这些详细信息。我正在分析我的服务器日志中的 404 和 500 响应。

可能会出现404(未找到)和500(服务器错误)消息,因为插件正在尝试检查缓存的资源是否是最新的。为此,它需要检查资源服务器版本的最后更新时间。

复杂的因素是资源可能位于archive小程序属性中提到的 Jar 中,或者它可能是与指定路径相同的“松散文件” codebase。因此,如果资源位于 Jar 的以下路径中:

/resources/properties/Messages_en_US.properties 

JVM 也会检查

${codebase}/resources/properties/Messages_en_US.properties 

以及每个罐子。

要修复它们,请参阅codebase_lookup参数。这个用例需要:

<param name='codebase_lookup' value='false' >

这告诉 JVM在类路径上没有存储为松散文件的资源,只有 Jars 将被搜索。它应该停止经常报告404/500消息(对于了解该参数的较新 JRE)。

于 2012-12-07T03:56:19.367 回答
0

我不太了解 Java 插件缓存小程序的内部细节,但如果您的小程序使用 .jnlp 描述符,我会尝试添加download="eager"到描述符的<jar>元素中。

您还可以尝试将 ResourceBundles 定义为类而不是 .properties 文件。例如:

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.
        };
    }
}

就像属性文件一样,您可以根据需要为任意数量的语言环境定义它们:

package resources.properties;

import java.util.ListResourceBundle;

public class Messages_es
extends ListResourceBundle  {
    protected Object[][] getContents() {
        return new Object[][] {
            {"entry1", "Some message text in Spanish"},
            {"entry2", "A different message in Spanish"},
            // etc.
        };
    }
}

如果您定义 ResourceBundle 子类,最好删除相应的 .properties 文件。

于 2012-12-05T12:32:18.697 回答