所以我需要为 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
您的资源字符串需要以斜杠开头,因为它与您的类不在同一个包中。
转述自getResource 的文档:
- 如果名称以 开头
/
,则资源的绝对名称是名称后面的部分/
。- 否则,绝对名称的形式为modified_package_name/name,其中 modified_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")
.
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句