自定义插件无法从 jar 复制文件,因为协议是“jar";

2022-01-17 00:00:00 sonarqube plugins java

我正在为 SonarQube 开发一个插件,它必须做的一部分是将文件从自身复制到 SonarQube 服务器的目录.我正在使用 Apache Commons IO,并且发现 FileUtils.copyDirectory 工作得非常好(在使用 main 方法对其进行测试之后).
麻烦来自试图从插件本身的 jar 中获取我想要复制的文件目录.我试过这个:

I am developing a plugin for SonarQube, and part of what it must do is copy files from itself to the SonarQube Server's directory. I am using Apache Commons IO, and have found that FileUtils.copyDirectory works wonderfully (after testing it with a main method).
The trouble comes from trying to get the directory of files that I want to copy from the jar of the plugin itself. I have tried this:

public File getSrcDir() {
    URL inputUrl = getClass().getResource("/images");
    File srcDir = FileUtils.toFile(inputUrl);
    System.out.println(srcDir);
    return srcDir;
}

当我在 IDE (Eclipse) 的 main 方法中运行它时,它会打印出 C:...[Project Directory] argetclassesimages但是,当我将插件作为 Sonar 的插件"文件夹中的 jar 文件夹安装到 SonarQube 中时,此方法会打印出 null.
我调查发现 FileUtils.toFile(URL url) 如果 url 参数的协议不是文件",则将返回 null.所以我在我的方法中添加了这一行:System.out.println(inputUrl.getProtocol());
果然,在我的IDE中,协议是文件",但是当我安装插件时,协议是jar"!

我花了最后一天倾注于 Stack Overflow 和 Google 试图找到解决此问题的方法,但无济于事.

我愿意尝试/重构任何东西.

我要做的就是让我的插件将其 jar 中的目录复制到 SonarQube 的服务器.
我该怎么做?

如果相关,这是我项目中的目录(我想复制图像"文件夹及其中的所有内容):

When I run it in a main method in my IDE (Eclipse), it prints out C:...[Project Directory] argetclassesimages But when I install the plugin into SonarQube as a jar folder in Sonar's "plugins" folder, this method prints out null.
I investigated and found that FileUtils.toFile(URL url) will return null if the url argument has a protocol other than "File". So I added this line to my method: System.out.println(inputUrl.getProtocol());
Sure enough, in my IDE the protocol is "file", but when my plugin is installed the protocol is "jar"!

I have spent the last day pouring over Stack Overflow and Google trying to find a way to deal with this, but to no avail.

I am willing to try/refactor anything.

All I want to do is make it so that my plugin copies a directory from within its jar to SonarQube's Server.
How can I do this?

In case it's relevant, here is the directory within my project (I want to copy the "images" folder and everything in it):

[Project Directory]
    |
    +--/src/main/resources
            |
            +--images
                 |
                 +--profiles
                          |
                          +--awards
                          |    |
                          |    +--Award1.png
                          |    |
                          |    +--Award2.png
                          |
                          +--projects
                               |
                               +--default.png

这里是 SonarQube 服务器中要复制到的目录:[SONARQUBE_HOME]/war/sonar-server/images

And here is the directory to copy to in the SonarQube server: [SONARQUBE_HOME]/war/sonar-server/images

推荐答案

当classpath中的资源(这里是图片或目录)来自jar时,不再是物理文件

When resource (in this case images or directory) in classpath coming from jar, it is no longer a physical file

您需要修改代码,使其从 Stream 而不是 File

You need to modify the code so that it reads those resources from Stream instead of File

  • 如何从
  • 从类路径目录中获取资源列表

相关文章