【问题标题】:Custom plugin can't copy files from jar because protocol is "jar"自定义插件无法从 jar 复制文件,因为协议是“jar”
【发布时间】:2013-07-29 12:28:10
【问题描述】:

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

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

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

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

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

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

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

【问题讨论】:

  • 类路径资源不是根据定义本地磁盘文件系统资源。总而言之,我相信您在解决您错误地认为 this 是正确解决方案的原始问题方面完全走错了方向。可能相关:stackoverflow.com/questions/8885201/…

标签: java plugins sonarqube


【解决方案1】:

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

您需要修改代码,使其从 Stream 而不是 File 读取这些资源


【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-01-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-07-04
  • 2012-12-13
  • 2020-04-13
相关资源
最近更新 更多