根据我的要求,我需要外部化message.properties文件(从war文件中保留外部),同时应在更新时自动重新加载该文件。
因此,通过遵循代码及其在Jetty Server上的正常工作,我既实现了目标。但是,当我使用Tomcat Server时,外部属性文件不会被系统接收,而是在战争中仅使用该文件。
public final class Messages { public static final String BUNDLE_NAME = "com.sample.project.core.ui.resources.messages"; // private static ResourceBundle resourceBundle = ResourceBundle.getBundle(BUNDLE_NAME); private static ResourceBundle resourceBundle; private static final Logger LOGGER = Logger.getLogger(Messages.class); private static ReloadableResourceBundleMessageSource messageSource; static { try { FileInputStream fis = new FileInputStream(System.getProperty("resources.messages.file.path")); resourceBundle = new PropertyResourceBundle(fis); } catch (FileNotFoundException e) { LOGGER.error("messages.properties file not found: " + e); resourceBundle = ResourceBundle.getBundle(BUNDLE_NAME); } catch (Exception e) { LOGGER.error("messages.properties file reading failed: " + e); resourceBundle = ResourceBundle.getBundle(BUNDLE_NAME); } } private Messages() { } /** * <p> * setter methos to ReloadableResourceBundleMessageSource object. * </p> * * * @param inMessageSource * set reloadable resources bundle **/ public static void setMessageSource(final ReloadableResourceBundleMessageSource inMessageSource) { Messages.messageSource = inMessageSource; Messages.messageSource.setBasename(System.getProperty("resources.messages.file.path")); } /** * <p> * Resolve a message by a key and argument replacements. * </p> * * @see MessageFormat#format(String, Object...) * @param key * the message to look up * @param arguments * optional message arguments * @return the resolved message **/ public static String getMessage(final String key, final Object... arguments) { try { if (messageSource != null) { return messageSource.getMessage(key, arguments, Locale.getDefault()); } else { if (arguments != null) return MessageFormat.format(resourceBundle.getString(key), arguments); return resourceBundle.getString(key); } } catch (NoSuchMessageException e) { LOGGER.error("Message key not found: " + key); return '!' + key + '!'; } catch (MissingResourceException e) { LOGGER.error("Message key not found: " + key); return '!' + key + '!'; } } }
(这是我使用“ resources.messages.file.path”键作为VM参数传递的文件路径)
resources.messages.file.path
首先,我认为访问文件系统存在问题,并尝试了许多方法。然后,我听说了catalina.policy文件,并添加了一些类似这样的行。
grant codeBase "file:${catalina.base}/webapps/sample.war/-" { permission java.security.AllPermission; permission java.io.FilePermission "file:${catalina.base}${file.separator}webapps${file.separator}messages.properties", "read, write"; permission java.util.PropertyPermission "resources.messages.file.path", "read"; }
但是他们都不给我带来好运。我很绝望。知道这个问题是什么吗?请帮我。先感谢您。(在Tomcat6上测试)
终于,我找到了搞砸的地方。
这的setter方法messageSource不应该是 静态的 ,我 删除静态访问 的messageSource
messageSource
messageSource = inMessageSource; messageSource.setBasename(System.getProperty("resources.messages.file.path"));
现在代码可以正常工作了。并且 不需要catalina.policy文件中的该权限条目。 感谢所有帮助我的人。