如何使用相对路径代替绝对路径

问题描述 投票:0回答:1

所以我需要为Intellij IDEA插件设置一个图标,但是当我尝试使用new File(relative path)getClass().getResource(relative path)从我的项目中获取此图标时。它找不到文件,仅适用于绝对路径。我尝试了以下相对路径:

  1. images/icon.png
  2. resources/images/icon.png
  3. main/resources/images/icon.png
  4. src/main/resources/images/icon.png

图标路径: src/main/resources/images/icon.png

源代码路径: src/main/java/com/timetrack/plugin/MyClass.java

code:

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

java intellij-plugin
1个回答
0
投票

您的资源字符串需要以斜杠开头,因为它与您的类不在同一个包中。

the documentation of getResource改写:

  • 如果名称以/开头,则资源的绝对名称是名称中紧随/之后的部分。
  • 否则,绝对名称的格式为modified_pa​​ckage_name / name,其中modified_pa​​ckage_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。

© www.soinside.com 2019 - 2024. All rights reserved.