我实现了需要从外部文件中提取数据的规则。我将此文件放在资源文件夹中,并使用以下结构提取它:
CustomRuleCheck.class.getResource(/com/packagename/file.json)
在JUnit测试期间,测试非常好,但是当我运行集成测试时,我无法获得此文件。
ava.io.FileNotFoundException: file:/home/username/.sonar/cache/587ed81cbc083da501c4bfdcefd65f35/sonar-plugin-0.0.10-SNAPSHOT.jar_unzip/META-INF/lib/custom-checks-0.0.10-SNAPSHOT.jar!/com/packagename/file.json (No such file or directory)
我跟着指向了url,原来文件夹/home/username/.sonar/cache/587ed81cbc083da501c4bfdcefd65f35/sonar-plugin-0.0.10-SNAPSHOT.jar_unzip/META-INF/lib/
包含custom-checks-0.0.10-SNAPSHOT.jar
,这个jar里面有必要的文件。
我不知道如何提取这个。你能帮帮我吗?
答案 0 :(得分:0)
据我了解,(感谢@JosefProcházka)sonar-plugin
在运行时加载CustomRules,从custom-checks.jar
上传特定规则。
我发现决定如何从CustomRules中的custom-checks.jar
中提取资源文件(自定义规则放在checks.jar
中)。
我写下了以下的util方法:
public class JarResourcesUtils {
public static File extractFileFromJar(String path) throws IOException {
String resourcePath = JarResourcesUtils.class.getResource(path).getPath();
String jarPath = resourcePath.replace("!" + path, "").replace("file:", "");
try (JarFile jarFile = new JarFile(jarPath)){
Enumeration<JarEntry> entries = jarFile.entries();
while (entries.hasMoreElements()) {
JarEntry entry = entries.nextElement();
String entryName = "/" + entry.getName();
if (entryName.equals(path)) {
InputStream inputStream = jarFile.getInputStream(entry);
File file = File.createTempFile(entryName.replaceAll("//", "_"), ".tmp");
FileUtils.copyToFile(inputStream, file);
return file;
}
}
return null;
}
}
}
然后在CustomRules中我们可以得到这个文件:
File resourceFile = JarResourcesUtils.extractFileFromJar("/com/packagename/file.json");
对于cource,文件必须根据maven约定放在资源目录中