我正在为 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) 的主要方法中运行它时,它打印出 C:\...\[Project Directory]\target\classes\images
但是当我将插件作为 Sonar 的“插件”文件夹中的 jar 文件夹安装到 SonarQube 中时,此方法打印出 null
。
我调查后发现,如果 url 参数具有"file"以外的协议(protocol),FileUtils.toFile(URL url)
将返回 null。所以我将这一行添加到我的方法中:System.out.println(inputUrl.getProtocol());
果然,在我的IDE中协议(protocol)是"file",但是当我的插件安装时协议(protocol)是“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
最佳答案
当类路径中的资源(在本例中为图像或目录)来自 jar 时,它不再是物理文件
您需要修改代码,使其从 Stream
而不是 File
中读取这些资源
查看
关于java - 自定义插件无法从 jar 复制文件,因为协议(protocol)是 "jar",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17928722/