我对 java 很陌生,并使用 JFrames 和 JPanels 制作了一个新项目来创建一个时钟显示来告诉时间、日期和天数。现在,当我将项目打包成 JAR 可执行文件并运行它时,我遇到了异常,并且不知道如何跟踪异常是什么/在哪里。我调查了一下,发现我从源代码获取资源(文件)的方式是不正确的。我获取该文件的方法是:“File {insert var name} = new File(projectname...\src\Assets\Cozy.ttf”),这只是 JPanel 使用的字体。我越是继续阅读“getResourceAsStream()”和“getResource()”等替代方案,我就越陷入困境。我不知道从哪里开始,因为我还没有处理过这个级别的文件。我读到了有关“File.createTempFile()”的内容,但这一切似乎都很令人困惑。我找不到任何简单有效的文档来满足我的需要。
我遇到的主要问题是我无法从 .JAR 内部加载 File 对象。我知道我没有进行描述,或者在没有任何代码的情况下这不是很有帮助,但我真的不知道现在该怎么做。
我尝试研究 Class.getResourceAsStream(),并在毫无问题地检索指定对象方面取得了一些成功,但是当我考虑将 InputStream 转换为文件时,整个事情变得有点无用,并没有得到任何真正容易的东西把我的头围起来。
我也不知道是否可以将原始 InputStream 使用到 Font 对象中,以使 Font.createFont(truetypeConstant,InputStream) 成为有效语法。
File
是字面意思。例如,它代表文件,而“jar 文件中的东西”不是文件。因此,如果不打开这些东西,你想要的东西就不可能实现。更一般地说,如果 src
位于硬编码路径中的任何位置,则这是行不通的。
解决办法是资源加载:
public class ThisIsAnExample {
public void setIconExample() {
JLabel label = ...;
label.setIcon(new ImageIcon(ThisIsAnExample.class.getResource("myIcon.png")));
}
}
使用注意事项:
ThisIsAnExample.class
。在同一个地方(同一个目录),放置 myIcon.png
。/src/main/resources
移动到 jar 中。如果您使用不同的构建系统,请找出放置非 java 文件的位置,以便将它们包含在内。如果您自己编写,请将它们复制到 jar 中。/myIcon.png
相对于 jar 的根。MyClass.class.getResource("MyClass.class")
- 类文件同样是资源,您可以索要它。getResource
返回一个 Swing 中的许多东西都允许的 URL,所以,使用它。如果没有,那么,有 getResourceAsStream
需要 try () {}
才能安全使用,那么,您就有了一个可以读取的输入流。.getClassLoader()
,也不要打电话给.getClass()
。这是MyClassName.class.getResource
(或getResourceAsStream
)。它们不会让事情变得更好,并且在某些情况下,这些替代方案会破坏 MyClass.class.getResource
却不会。jar tvf myjar.jar
向您展示了 jar 结构。