只有当作为jar运行时,才加载绑定在jar中的文件



我有一个属性文件,它包含在我将要分发的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文件位于同一个包中。

最新更新