因此,我需要为Intellij IDEA插件设置图标,但是当我尝试使用new File(relative path)
或getClass().getResource(relative path)
从项目中获取此图标时。它找不到文件,仅适用于绝对路径。我尝试了以下相对路径:
images/icon.png
resources/images/icon.png
main/resources/images/icon.png
src/main/resources/images/icon.png
图标路径: src/main/resources/images/icon.png
源代码路径: src/main/java/com/timetrack/plugin/MyClass.java
代码:
File file = new File("src/main/resources/images/running.png");
BufferedImage img = ImageIO.read(file);
或与此
BufferedImage img = ImageIO.read(getClass().getResource("images/running.png"));
编辑
需要提到我正在使用Gradle构建项目。所以输出目录如下:
图标路径:build/resources/main/images/icon.png
编译的类:
build/classes/java/main/com/timetrack/plugin/MyClass.class
答案 0 :(得分:0)
您的资源字符串需要以斜杠开头,因为它与您的类不在同一个包中。
从the documentation of getResource改写:
- 如果名称以
/
开头,则资源的绝对名称是名称后面/
的一部分。- 否则,绝对名称的格式为 modified_package_name / name ,其中Modifyed_package_name是此类的软件包名称,其中
/
替换为.
。
换句话说,假定传递给Class.getResource的参数与Class本身位于同一包中,除非该参数以斜杠开头。
这是因为在应用程序或库中包含资源的正确方法是将它们放置在与使用它们的类相同的包目录中。这样做的原因与我们使用软件包的原因相同。因此,应用程序不将其所有文件都存储在用户的主目录或C:\
中是相同的原因:因为存在其他程序选择相同名称并干扰您的程序的真实风险。
Class.getResource在类路径中搜索请求的资源。如果将图标打包为images/running.png
,并且库也决定将其图像打包为images/running.png
,则Class.getResource将搜索类路径并返回其最先找到的内容。根据类路径条目的顺序,您将得到错误的图像,或者该其他库将得到错误的图像。两者本质上是互相踩踏的。
另一方面,如果将图片放在src/main/resources/com/timetrack/plugin/running.png
上,则其他任何代码都不太可能使用该包,因此发生碰撞的几率很小。并且由于这是最常见的用例,因此以这种方式使用它更容易:您可以仅使用MyClass.class.getResource("running.png")
来检索图像URL。