【问题标题】:How to access my applications' resources inside a runnable jar?如何在可运行的 jar 中访问我的应用程序的资源?
【发布时间】:2011-10-31 19:57:31
【问题描述】:

我刚刚发布了这个问题:How to distribute my Java program so that it is runnable by double-clicking a single file?,当我让可运行的 jar 工作时,许多事情并没有按照我希望的方式工作,因为我的程序找不到我想要使用的资源,例如图像和SQLite 数据库文件。

在我的文件系统中,我在 img 文件夹中有几个 .png 图像,并且在项目的根文件夹中有一个名为 test.db 的数据库

当我的项目在 Eclipse 中时,我使用以下方式访问了我的图像:

BufferedImage bufImg = ImageIO.read(new File("img/anImage.png"))

我使用以下方法连接到我的 SQLite 数据库:

Class.forName("org.sqlite.JDBC");
conn = DriverManager.getConnection("jdbc:sqlite:test.db");

现在,当我双击我新创建的 runnable-jar 时,找不到资源。我想知道我应该如何访问它们并让我的程序在它不在 IDE 中时运行。

我还想知道如何查看例外情况(如果可能的话)。因为现在,一些页面保持灰色,因为它们没有加载,因为(我猜)一些资源无法找到,但我不知道是只有数据库导致问题还是图像也是。

非常感谢,很抱歉在这么短的时间内提出两个相关问题!

【问题讨论】:

  • “很抱歉在这么短的时间内提出了两个相关的问题!”它们都是很好的问题,所以我不能接受你的道歉 - 我只会投票。

标签: java resources jar double-click


【解决方案1】:

Jar 中没有文件,只有资源,所以大多数使用文件的方法也会接受资源。

例如 ImageIO.read(...) 有一个接受 URL 的重载和一个接受 InputStream 的重载。所以试试

BufferedImage bufImg = ImageIO.read(MyClass.class.
         getResourceAsStream("img/anImage.png"));

请务必使用相对于类文件位置和您的实际类名的路径,或this.getClass()

【讨论】:

  • 我明白了,我会尝试一下,看看它是如何工作的。不过,只是一个问题:即使我的应用程序不在 jar 中,资源方法也会起作用吗?如果他们这样做,我看不出为什么甚至应该使用 File 版本,因为当你把它放进罐子里时它会坏掉?另外,我如何访问没有可以将它们作为资源访问的方法的文件?
  • 是的,资源版本应该适用于非 jar 类。资源的主要限制是只读,而文件没有这个限制。关于在没有允许资源的方法的情况下访问文件——我无法回答这个一般性问题。有具体的例子吗?
  • 我没有,我只是不想在将来遇到一个时被卡住......你的最后评论“资源的主要限制是阅读 -只有”,但有些东西我不完全理解......如果资源是只读的,这是否意味着我将无法将我的 SQLite 数据库文件放入 JAR 文件中,因为我想要当我在我的应用程序中获取新数据时在其中写入一些新行?使用 jar 外部的绝对路径来访问文件会更好吗?
  • 是的,这是绝对正确的,你不能在 jar 内有任何需要修改的东西。所以把它放在jar外面,调用jar的时候在命令行传递数据库的路径。我在 Windows 中通过创建 Windows 快捷方式或 bat 文件来完成此操作。
  • "..这就是我阅读动物内脏的能力。" 不要回避预兆检查。学会阅读内脏 - 一切都会变得众所周知(而且有点滑)!
猜你喜欢
  • 2014-07-04
  • 2019-08-31
  • 2012-02-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-12-25
  • 2015-01-16
  • 1970-01-01
相关资源
最近更新 更多