从Heroku中的资源读取xml文件时出错

时间:2018-03-31 21:47:05

标签: java heroku fileinputstream

错误:

java.io.FileNotFoundException: class path resource [xml/ruleSet.xml] cannot be resolved to absolute file path because it does not reside in the file system: jar:file:/app/target/******-0.0.1-SNAPSHOT.jar!/BOOT-INF/classes!/xml/ruleSet.xml

代码:

File ruleSet = new ClassPathResource("xml/ruleSet.xml").getFile();
pmdConfiguration.setReportFormat("text");
pmdConfiguration.setRuleSets(ruleSet.getAbsolutePath());

我需要将完整文件插入到setRuleSets方法中,FileInputStream将如何帮助我?

FileInputStream ruleSet = new FileInputStream(ClassLoader.getSystemResource
                    ("xml/ruleSet.xml").getPath());

我是否应该通过读取fileinput流重新创建临时文件并将该文件路径传递给setRuleSets方法?

2 个答案:

答案 0 :(得分:0)

根本问题是JAR文件中的资源在文件系统命名空间中没有路径。这就是ClassPathResource::getFile抛出异常的原因,也是URL::getPath

的原因

还有另一种选择。使用InputStream而不是FileInputStream,并使用类加载器API方法将资源打开为流。

变化:

    FileInputStream ruleSet = new FileInputStream(ClassLoader.getSystemResource
                    ("xml/ruleSet.xml").getPath());

    InputStream ruleSet = ClassLoader.getSystemResourceAsStream("xml/ruleSet.xml");

在这种情况下,这不会起作用,因为PMDConfiguration::setRuleSets没有采用流参数。

然而,javadoc州:

public void setRuleSets(String ruleSets)
     

设置命令 1 分隔的RuleSet URI列表。

由于getResource方法会返回一个网址,因此您能够执行此操作:

    pmdConfiguration.setRuleSets(
        ClassLoader.getSystemResource("xml/ruleSet.xml").toString();

<强>更新

如果getSystemResourcegetSystemResourceAsStream失败,则资源不存在(在运行时类路径中的JAR等中),路径不正确,或者您应该使用{{1} }或getResource

1 - &#34;命令&#34;是一个错字。它应该是&#34;逗号&#34;。

答案 1 :(得分:0)

好的所以我想出了在这里做什么,

我们已经有输入流,因此我将输入流转换为临时文件,并使用该文件.getPath。

ClassLoader classLoader = this.getClass().getClassLoader();
InputStream resourceAsStream = classLoader.getResourceAsStream("xml/ruleSet.xml");
String ruleSetFilePath = "";
if(resourceAsStream != null){
    File file = stream2file(resourceAsStream);
    ruleSetFilePath = file.getPath();

}
pmdConfiguration.setRuleSets(ruleSetFilePath);

public static File stream2file (InputStream in) throws IOException {
final File tempFile = File.createTempFile("ruleSet", ".xml");
tempFile.deleteOnExit();
try (FileOutputStream out = new FileOutputStream(tempFile)) {
    IOUtils.copy(in, out);
}
return tempFile;
}