我已经在eclipse中完成了一个程序,现在我想把它作为一个可运行的jar文件导出。该程序包含一个资源文件夹,其中包含图像和文本文件。它位于源文件夹下。
res文件没有添加到构建路径中,但是当我在Eclipse中运行程序时,它仍然有效。 令我困惑的是,当我导出res文件时,res文件被保存到runnable jar文件中,因为我可以使用WinRar打开Jar文件,我看到文件夹中包含所有对象。但是当我运行问题时,它会在引用资源文件夹时停止。当我手动复制并粘贴保存runnable jar文件的位置旁边的res文件夹并运行程序时,它会让我感到困惑。它完全按照它应该的方式工作。
现在我知道这与我在代码中引用文件的方式有关。目前我有这样的
reader = new LineNumberReader(new FileReader("res/usernames.txt"));
这正是我想要的,并且没有任何异常地访问res文件夹 - 在Eclipse中以及当我移动Jar文件旁边的资源文件夹时。
我希望它能正常工作,但没有Jar文件之外的文件夹,我希望它全部封装在一个Jar文件中。
我做了很多研究,似乎是一个常见的修复方法 - 我可以补充一下,我真的不知道它是如何工作的,但每个人似乎都提到它 - 是在某个地方使用:
myClass().getResource()
当我创建一个新的FileReader时,它需要一个String输入,但是当我使用myClass()。getResource()时,它返回一个资源,而不是一个字符串。我也不知道它是如何引用资源文件夹的。我应该将资源文件夹移动到源文件夹吗?
有谁知道如何从runnable jar文件中引用资源文件夹?
对于漫无边际的问题,我很了解我对最终产品的要求,但是我对构建路径和课堂内部的引用感到困惑,我已经在网上搜索了很长时间,试图找出答案。
答案 0 :(得分:3)
部署软件时,资源未部署为文件夹中的文件。它们作为应用程序jar的一部分打包。然后通过从jar内部检索它们来访问它们。类加载器知道如何从jar中检索东西,因此你使用类的类加载器来获取信息。
这意味着你不能在它们上面使用FileReader
之类的东西,或者任何其他需要文件的东西。资源不再是文件。它们是坐在jar中的字节包,只有类加载器知道如何检索。
如果资源是像图像等的东西,那些知道如何访问资源URL的java类可以使用(也就是说,当jar在jar中给出它的位置时从jar中获取数据),你可以使用ClassLoader.getResource(String)
方法获取URL并将其传递给处理它们的类。
如果您想直接处理资源中的数据(通常通过从文件中读取数据),您可以使用方法ClassLoader.getResourceAsStream(String)
。
此方法会返回InputStream
,您可以像使用其他任何InputStream
一样使用Reader
- 将InputStream is = myClass().getResourceAsStream("res/usernames.txt");
reader = new LineNumberReader( new InputStreamReader(is) );
应用于此类推文。
因此,您可以将代码更改为:
getResourceAsStream()
请注意,我使用的是Class
而不是ClassLoader
的{{1}}方法。两个版本在jar中查找资源的方式略有不同。请阅读Class
和ClassLoader
的相关文档。