SonarQube。自定义规则需要访问文件

时间:2018-01-31 08:57:03

标签: java sonarqube

我实现了需要从外部文件中提取数据的规则。我将此文件放在资源文件夹中,并使用以下结构提取它:

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里面有必要的文件。 我不知道如何提取这个。你能帮帮我吗?

1 个答案:

答案 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约定放在资源目录中