只有在jar运行时才加载jar中捆绑的文件

时间:2012-08-31 16:41:21

标签: java configuration-files

我有一个属性文件,我已经包含在我将要分发的jar中。在我决定将文件包含在jar中之前,我正在加载它像

properties.load(new FileInputStream(configFileName));

但是一旦将文件放入jar中,这就停止了工作,所以我将代码更改为

properties.load(MyClass.class.getResourceAsStream(configFileName));

唯一的问题是我有使用我的属性的单元测试(静态加载,所以我无法模拟它)。在制作罐子之前运行单元测试,所以它们现在都失败了。有没有一种优雅的方法来处理只在程序作为jar运行时才会在jar中的文件?

3 个答案:

答案 0 :(得分:1)

执行此操作的一种方法是调用getResourceAsStream(),如果它返回null call new FileInputStream()

但更好的问题是:运行单元测试时,为什么不在类路径中的属性?如果您正在使用像Maven这样的构建工具,那么这应该是自动的。而且它会更好地表明你实际上在构建你认为自己的东西。

答案 1 :(得分:0)

如果您乐意将属性文件与源代码一起使用,请尝试:

properties.load(getClass().getResourceAsStream("my.properties"));

在这种情况下,my.properties文件必须与.java文件位于同一个包中。

答案 2 :(得分:0)

问题可能是你的类加载器看不到这个文件..

我会用这个

Classloader cl = getClass().getClassloader();
properties.load(cl.getResourceAsStream(configFileName))

如果这个应用程序是一个webapplication,请注意你的类加载..在这种情况下你会有很多类加载器..你的资源必须对这个类加载器可见.. 在像tomcat这样的servlet容器中,它们以这种方式工作

  Bootstrap
      |
   System
      |
   Common
    /     \
Webapp1   Webapp2 ... 

你可以在这里阅读更多内容 http://tomcat.apache.org/tomcat-6.0-doc/class-loader-howto.html