错误:
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
方法?
答案 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();
<强>更新强>
如果getSystemResource
或getSystemResourceAsStream
失败,则资源不存在(在运行时类路径中的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;
}