getClassLoader()。getResource(“Configuration.xml”)。getPath()在jar内部不起作用

时间:2015-08-27 15:19:14

标签: java xml maven intellij-idea maven-resources-plugin

我已经创建了一个基于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中的另一个问题。

任何人都可以为我提供一个解决方案,我不必更改代码,而是更改我的资源目录结构,或更改类路径,或其他能保持我的代码正常工作的东西吗? 感谢。

1 个答案:

答案 0 :(得分:0)

更新:已更改为使用File,而不是Path

这是因为getResource返回URL,并非所有网址都是磁盘上的文件,即可以转换为Path。正如javadoc所说“如果[路径部分]不存在则返回[...]空字符串”。

如果绝对必须FileFileInputStream,因为您无法更改的其他代码需要它,然后将内容复制到临时 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开发模式有助于测试代码。