我有一个Maven项目,我试图打包成一个战争和一个jar。作为我的应用程序/ servlet初始化的一部分(取决于我是运行jar还是war),我需要读取一个名为server.ini
的文件。我已经把src/main/resources/server.ini
文件,我试图加载它,像这样:从战争中加载配置文件
System.class.getResourceAsStream("server.ini");
然而,这总是导致null
。我究竟做错了什么?
我有一个Maven项目,我试图打包成一个战争和一个jar。作为我的应用程序/ servlet初始化的一部分(取决于我是运行jar还是war),我需要读取一个名为server.ini
的文件。我已经把src/main/resources/server.ini
文件,我试图加载它,像这样:从战争中加载配置文件
System.class.getResourceAsStream("server.ini");
然而,这总是导致null
。我究竟做错了什么?
server.ini
文件应位于资源目录的根目录中。
通过将它放在webapp
中,您可以通过http
使该文件可用,但您需要通过classpath
访问该文件,这意味着您应该将其置于资源目录中。
有一个很好的机会web.xml
或context.xml
是更适合你想要做什么,而是......
尝试把server.ini
在WEB-INF/classes
,或做类似this。
你不应该直接在WEB-INF/classes中放入任何东西。当你告诉它清理干净,Maven会清除那个目录,你会丢失你的文件。该目录实际上受Maven控制。 –
但我同意你最好使用web.xml来配置你的服务器。 –
如果我只在一个servlet容器中运行它,我可以使用web.xml。但是,我需要它也用完一个罐子。 –
问题是我使用的系统classloader具有不合格的路径,所以它期望在java.lang
包中找到我的server.ini
。
由于我的文件在src/main/resources
,我就用我的当前类的类加载器,以绝对路径:
getClass().getResourceAsStream("/server.ini")
这个工程在战争中的jar两者。
“Preferred way of loading resources in Java”问题对资源加载有很好的解释。
这正是我想要做的:加载配置文件作为一个资源,所以它工作,无论我是否运行的战争或罐子。我已经更新了我的问题以使其更清楚。然而,我试图加载文件作为资源在jar和war中都失败了。我确信我正在做一些微不足道的事情,但不知道它是什么。 : -/ –
你正在用maven构建吗?将文件放在资源目录中将导致它成为需要的地方。如果你把它放在资源的子目录中,那么你需要调整你的java行来引用子目录。 –
现在我知道这个微不足道的错误是什么:我需要用斜杠加上我的文件名,否则类加载器会在'java.lang'中查找。所以这个工作:'this.getClass()。getResourceAsStream(“/ server.ini”)' –