我已经创建了一个基于maven的java项目,它有一个资源目录(src / java / resources),其中有一些xml文件和maven将它们复制到target / classes / resources(目标/类是我的类路径)。
要知道xml文件的内容,我使用:
new FileInputStream(Main.class.getClassLoader().getResource("Configuration.xml").getPath());
Main.class.getClassLoader()。getResource(“Configuration.xml”)。getPath()为我提供了xml的完整路径:“c:\ project ... \ Configuration.xml”。
这对intellij很有效。
但是当我将项目编译并打包到jar文件中时,我得到了:
Exception in thread "main" java.io.FileNotFoundException:
file:\C:\project\target\project-12.50.14-SNAPSHOT-jar-with-dependencies
.jar!\Configuration.xml
(The filename, directory name, or volume label syntax is incorrect)
那是因为路径:\ C:\ project \ target \ project-12.50.14-SNAPSHOT-jar-with-dependencies .jar!\ Configuration.xml不能是FileInputStream()的参数。
我无法将getResource()替换为getResourceAsStream()。
我需要一种方法来调整我的jar和资源,就像它在intellij上工作一样。 我还在运行时更改了xml资源文件内容,这是将它们保存在jar中的另一个问题。
任何人都可以为我提供一个解决方案,我不必更改代码,而是更改我的资源目录结构,或更改类路径,或其他能保持我的代码正常工作的东西吗? 感谢。
答案 0 :(得分:0)
更新:已更改为使用File
,而不是Path
。
这是因为getResource
返回URL
,并非所有网址都是磁盘上的文件,即可以转换为Path
。正如javadoc所说“如果[路径部分]不存在则返回[...]空字符串”。
如果绝对必须是File
或FileInputStream
,因为您无法更改的其他代码需要它,然后将内容复制到临时 file:
File file = File.createTempFile("Configuration", ".xml");
try {
try {InputStream in = Main.class.getClassLoader().getResourceAsStream("Configuration.xml")) {
Files.copy(in, file.toPath()); // requires Java 7
}
// use file here, or:
try {FileInputStream in = new FileInputStream(file)) {
// use file stream here
}
} finally {
file.delete();
}
如果资源是文件,上面的代码可以优化不复制,但由于这只是开发模式,生产模式总是Jar,并且总是需要副本,使用copy in开发模式有助于测试代码。