2012-12-05 25 views
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应用程序中不可用作为松散资源。

+0

我的大部分用户都使用Java 1.5插件。所以我使用'object'和'embed'标签来运行我的小程序。 – ADITHYAN

+0

基于JNLP的applet之前的默认值是热切下载所有资源。 –

+0

@AndrewThompson如果是这样,为什么applet在运行时请求资源.. – ADITHYAN

回答

5

我从服务器日志这些细节。我分析了我的服务器日志404升500的反应..

404(未找到)& 500(服务器错误),可以预期的消息因为插件试图检查缓存的资源是否是最新的。要做到这一点,它需要检查上次更新的资源服务器版本的时间。

的复杂因素是,该资源可被预期为在小程序它可以是作为指定的codebase相同的路径上的“松散文件”的archive属性提到一个Jar。所以,如果资源是在一个罐子里的以下路径:

/resources/properties/Messages_en_US.properties 

的JVM还将检查

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

以及每个罐子。

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

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

这告诉JVM有存储为类路径上的松动文件没有资源,只有罐子被搜索。它应该停止经常报告的消息(对于理解该参数的更新的JRE)。

+0

非常感谢它实际上解决了我的问题.. – ADITHYAN

+0

经过测试,我发现它适用于** JRE 1.6 + **,并且在下面失败,任何如何减少我的痛苦。 。谢谢 – ADITHYAN

+0

是的,对不起,我无法找到它被引入的确切版本。您可能会发现1.6.0_10 +版本中引入了很多更改。尽管如此,现在大多数JRE都配置为自动更新,但随着时间的推移应该会减少痛苦。 :) –

0

我对Java插件缓存applet的内部细节知之甚少,但如果您的applet使用.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文件。

+0

Jnlp对applet的支持是从Java 1.6.10提供的。我也在Java 1.5+中运行 – ADITHYAN

相关问题