【问题标题】:Java images loaded in ide but not built jarJava 图像在 ide 中加载但未构建 jar
【发布时间】:2018-12-11 01:24:19
【问题描述】:

我的文件路径如下:

  +------------+           +-----------------+      +------------------+
  |            |           |                 |      |                  |
  | src        +----------->  com            +--+--->  application     |
  |            |           |                 |  |   |                  |
  +------------+           +-----------------+  |   +------------------+
                                                |
                                                |   +------------------+
                                                |   |                  |
                                                +--->  resources       |
                                                    |                  |
                                                    +------------------+

我的代码在应用程序文件夹中,我要加载的图片在资源中。

我使用以下代码将图像从资源中获取到应用程序中的类(图像是 BufferedImage)。

image = ImageIO.read(new File("./src/com/resources/Pad.png"));

这似乎在我的 IDE (intellij) 中工作,因为我可以看到加载的图像为 shown

但是,当我构建时,没有显示图像。我正在构建:

文件 -> 项目结构 -> 工件 -> 绿加 -> JAR -> 从具有依赖项的模块 -> 我的主类位置 -> 提取到目标 Jar

然后我构建工件 -> 构建。

所以当我去构建 jar 的目的地并运行它时,没有一张图片是 shown

我通过提取包含图片但由于某种原因代码未加载图片的 jar 来检查图像是否在构建的 jar 中。

【问题讨论】:

  • 请说明ImageIO类的包。是javax.imageio吗?
  • 它是import javax.imageio.ImageIO;
  • 永远不要在你的代码中引用src——这正是你现在拥有的原因

标签: java image build jar embedded-resource


【解决方案1】:

您可以尝试将资源用作流而不是文件。

image = ImageIO.read(this.getClass().getClassLoader().getResourceAsStream("com/resources/Pad.png"))

【讨论】:

  • 这已经解决了,谢谢。流似乎使它工作,你知道为什么它作为流工作,但当我使用文件时不工作?
  • @NotSoVisualBasic 你了解什么是 Jar 文件吗?它只是一个基于 Zip 的文件。因此,当您“Jar”您的项目时,所有文件都存储在一个二进制文件中,这意味着“文件”不能再通过文件系统访问(因为它们不存在),相反,您需要使使用 API 来查找和加载那些嵌入在 Jar 文件中的资源(或者,作为一个简洁的副作用,在类路径中)
  • 是的,我知道 jar 文件就像一个压缩文件夹,但我没有意识到在构建后您将无法像在 IDE 中开发程序那样访问这些文件.不过感谢您的解释!
【解决方案2】:

src 路径在构建 jar 中不可用。您应该使用类加载器从类路径加载资源。例如。 (假设 'src' 是类路径根目录)

image = ImageIO.read(new File(this.getClass()                   
.getResource("com/resources/Pad.png").getPath());

已根据@MadProgrammer 的建议编辑

【讨论】:

  • 这对我不起作用我使用:image = ImageIO.read(new File(this.getClass().getClassLoader().getResource("com/resources/Pad.png").getPath())); 因为文件不会使用 URL,并且构建的 jar 没有显示图片。
  • 问题是:你的 claspath 根是什么?
  • 不知道,怎么找到?
  • 使用 image = ImageIO.read(new File(this.getClass().getClassLoader().getResource("com/resources/Pad.png").getPath())); 从 IDE 运行程序时可以看到图像,但如果我构建它,则在运行 jar 时不会加载图像。
  • new File(this.getClass().getClassLoader() .getResource("com/resources/Pad.png") 已失效且毫无意义。嵌入在Jar 文件中的资源将无法作为File 访问,这就是使用Class#getResource 的全部意义所在。此外,由于 ImageIO.read 不采用 String 您只是在生成编译器错误 - 简单地使用 this.getClass().getResource("...") 代替
猜你喜欢
  • 2021-12-10
  • 1970-01-01
  • 2012-06-24
  • 2012-09-08
  • 1970-01-01
  • 2017-06-30
  • 1970-01-01
  • 2015-08-12
  • 1970-01-01
相关资源
最近更新 更多