2014-02-14 57 views
1

我有一个Maven项目,我试图打包成一个战争和一个jar。作为我的应用程序/ servlet初始化的一部分(取决于我是运行jar还是war),我需要读取一个名为server.ini的文件。我已经把src/main/resources/server.ini文件,我试图加载它,像这样:从战争中加载配置文件

System.class.getResourceAsStream("server.ini"); 

然而,这总是导致null。我究竟做错了什么?

回答

1

server.ini文件应位于资源目​​录的根目录中。

通过将它放在webapp中,您可以通过http使该文件可用,但您需要通过classpath访问该文件,这意味着您应该将其置于资源目录中。

+0

这正是我想要做的:加载配置文件作为一个资源,所以它工作,无论我是否运行的战争或罐子。我已经更新了我的问题以使其更清楚。然而,我试图加载文件作为资源在jar和war中都失败了。我确信我正在做一些微不足道的事情,但不知道它是什么。 : -/ –

+0

你正在用maven构建吗?将文件放在资源目录中将导致它成为需要的地方。如果你把它放在资源的子目录中,那么你需要调整你的java行来引用子目录。 –

+0

现在我知道这个微不足道的错误是什么:我需要用斜杠加上我的文件名,否则类加载器会在'java.lang'中查找。所以这个工作:'this.getClass()。getResourceAsStream(“/ server.ini”)' –

1

有一个很好的机会web.xmlcontext.xml是更适合你想要做什么,而是......

尝试把server.iniWEB-INF/classes,或做类似this

+0

你不应该直接在WEB-INF/classes中放入任何东西。当你告诉它清理干净,Maven会清除那个目录,你会丢失你的文件。该目录实际上受Maven控制。 –

+0

但我同意你最好使用web.xml来配置你的服务器。 –

+0

如果我只在一个servlet容器中运行它,我可以使用web.xml。但是,我需要它也用完一个罐子。 –

1

问题是我使用的系统classloader具有不合格的路径,所以它期望在java.lang包中找到我的server.ini

由于我的文件在src/main/resources,我就用我的当前类的类加载器,以绝对路径:

getClass().getResourceAsStream("/server.ini") 

这个工程在战争中的jar两者。

Preferred way of loading resources in Java”问题对资源加载有很好的解释。