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

时间:2013-07-29 16:02:17

标签: java plugins sonarqube

我正在为SonarQube开发一个插件,它必须做的部分是将文件从自身复制到SonarQube服务器的目录。我正在使用Apache Commons IO,并且发现FileUtils.copyDirectory非常有效(在使用main方法测试之后)。 问题来自于尝试从插件本身的jar中获取我想要复制的文件目录。我试过这个:

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]\target\classes\images 但是当我将SonarQube插件作为一个jar文件夹安装到Sonar的“plugins”文件夹中时,此方法打印出null
我调查并发现如果url参数的协议不是“File”,FileUtils.toFile(URL url)将返回null。所以我将这一行添加到我的方法中:System.out.println(inputUrl.getProtocol());
果然,在我的IDE中协议是“文件”,但是当我的插件安装时,协议是“jar”!

我花了最后一天倒在Stack Overflow和谷歌试图找到解决这个问题的方法,但无济于事。

我愿意尝试/重构任何东西。
/>我想做的就是让我的插件将一个目录从它的jar中复制到SonarQube的服务器。
我怎么能这样做?

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

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

以下是要在SonarQube服务器中复制的目录: [SONARQUBE_HOME]/war/sonar-server/images

1 个答案:

答案 0 :(得分:1)

当classpath中的资源(在本例中是图像或目录)来自jar时,它不再是物理文件

您需要修改代码,以便从Stream而不是File

中读取这些资源

查看