我有一个属性文件,它包含在我将要分发的jar中。在我决定将文件包含在罐子中之前,我像一样加载它
properties.load(new FileInputStream(configFileName));
但一旦文件被放进罐子里,这就停止了,所以我把代码改成了
properties.load(MyClass.class.getResourceAsStream(configFileName));
唯一的问题是我有使用我的属性的单元测试(它们是静态加载的,所以我不能模拟它)。单元测试是在制作jar之前运行的,所以它们现在都失败了。有没有一种优雅的方法来处理只有当程序作为jar运行时才会在jar中的文件?
getResourceAsStream()
,如果返回null,则调用new FileInputStream()
。
但一个更好的问题是:当您运行单元测试时,为什么类路径中没有属性?如果您使用的是像Maven这样的构建工具,那么这应该是自动的。这会给人一种更好的感觉,你实际上是在构建你认为自己是什么。
问题可能是这个文件对类加载器不可见。。
我要用这个
Classloader cl = getClass().getClassloader();
properties.load(cl.getResourceAsStream(configFileName))
如果这个应用程序是一个网络应用程序,请注意你的类负载。。在这种情况下,你会有很多类加载器。。您的资源必须对此类加载器可见。。在像tomcat这样的servlet容器中,它们以这种方式工作
Bootstrap
|
System
|
Common
/
Webapp1 Webapp2 ...
你可以在这里阅读更多http://tomcat.apache.org/tomcat-6.0-doc/class-loader-howto.html
如果您希望属性文件与源代码一起使用,请尝试:
properties.load(getClass().getResourceAsStream("my.properties"));
在这种情况下,my.properties
文件必须与.java
文件位于同一个包中。