ust*_*tun 11 resources jsf internationalization properties-file
我试图访问我在代码中的JSF应用程序中使用的i18n属性文件.(这个想法是让一个页面显示其键和值实际上是一个表.)
该项目是一个maven项目,位于src/resources/localization文件夹中,并部署在WEB-INF\classes\localization \中的war文件中
java.util.Properties prop = new java.util.Properties();
String path = "localization/stat_codes.properties";
InputStream foo = prop.getClass().getResourceAsStream(path);
Run Code Online (Sandbox Code Playgroud)
但是无论我将路径变量设置为/WEB-INF/classes/localization/stat_codes.properties,"insetation.stat_codes.properties"等,变量foo都是null.类似的问题在这里,但是没有任何帮助也回答那里.
Bal*_*usC 23
该Class#getResourceAsStream()可以是相对的位置的路径Class,你正在使用有作为出发点这.因此,例如,如果类位于com.example包中并且您请求路径foo/filename.properties,那么它实际上将加载该com/example/foo/filename.properties文件.但是如果你使用/foo/filename.properties,那么它实际上foo/filename.properties将从类路径根加载.
所以,你的代码
java.util.Properties prop = new java.util.Properties();
String path = "localization/stat_codes.properties";
InputStream foo = prop.getClass().getResourceAsStream(path);
Run Code Online (Sandbox Code Playgroud)
将实际查找java/util/localization/stat_codes.properties文件.
但是在具有复杂的多类加载器层次结构的应用程序中,一个类加载器不是另一个.加载核心Java类的类加载器不一定了解webapp中的文件/WEB-INF/classes.因此,为路径添加前缀/不一定是解决方案,它仍然会返回null.
如果您可以保证当前类与属性文件相同的类加载器可见(因为它们位于类路径的相同子根中,例如/WEB-INF/classes,那么您应该确实使用
String path = "/localization/stat_codes.properties";
InputStream foo = this.getClass().getResourceAsStream(path);
Run Code Online (Sandbox Code Playgroud)
但是,如果在某些时候,属性文件将被外部化,因为在运行时更容易维护/编辑,这样您无需在编辑文件时重建/重新部署/重新启动webapp,然后上面的代码行也可能会失败.外部化位置只能由不同的类加载器访问.规范的解决方案是使用线程的上下文类加载器作为起始点,它可以访问类路径中的所有资源.
String path = "localization/stat_codes.properties";
ClassLoader loader = Thread.currentThread().getContextClassLoader();
InputStream foo = loader.getResourceAsStream(path);
Run Code Online (Sandbox Code Playgroud)
(注意,这个不能从一个开始的路径/,它总是相对于公共根)
| 归档时间: |
|
| 查看次数: |
5779 次 |
| 最近记录: |