即使路径相同,导出的jar也会找到一些文件(不是全部)

时间:2014-06-30 21:30:58

标签: java eclipse jar

当我从eclipse运行我的程序时,它显示正常,来自Resources \的图像显示,来自同一地方的声音,以及文本文件被正确找到。但是,当我导出我的jar并使用7Zip将资源复制到其中时,图像将起作用,但是声音和文本文件无法找到,即使它们位于同一文件夹中,使用相同的路径在我的代码中找到它们。我可以通过在名为Resources的jar文件旁边放一个文件夹并将所有内容放在那里来解决这个问题,但是我想知道为什么只将它放在jar文件中才能用于图像,以及我如何将它放到使用文本和音频文件。 一个例子,向您展示我的意思:

File inventory = new File("Resources/inv.txt");
threadpath = "Resources/threads.wav";
enemy1 = new Sprite(new Texture("Resources/miniForestGolem.png"));

当我在eclipse中运行它时,这三个工作正常,但是当我导出它,并将资源文件夹放在jar文件中时,只有图像有效。

修改

我知道如何包含我的资源,并且已经这样做了,我问的是如何/为什么某些资源无法访问,即使在添加它们之后也是如此。< / p>

1 个答案:

答案 0 :(得分:1)

好的,从您的评论中我们可以推断出从eclipse执行它和从.jar执行它之间的区别。

  • 来自eclipse:它有效,因为所有new File(...)在Resources /
  • 中找到了一个实际文件
  • 来自.jar:它不会起作用,因为应用程序执行路径中的相对./Resources /路径中没有文件。

让它成功的方法是下一步:

  • 确保Eclipse将Resources /识别为源文件夹(右键单击项目属性,Java Build Path,并将其添加为源路径)
  • 寻找API方法的替代品,而不是File个对象,而是使用InputStreams。获得后,将所有资源检索为从类路径中获取的InputStream。如果您在MyClass.java中,请执行以下操作:MyClass.class.getClassLoader().getResourceAsStream("Resources/inv.txt")等。

您通过这样做获得了什么:代替在实际操作系统文件上构建的File个对象,您将直接从java应用程序类路径中检索InputStreams读取。这样,您可以将它们打包到jar中,或者打包到Web应用程序内的WEB-INF / classes目录中,或者打包到某些应用程序服务器中的库文件夹...只要它进入应用程序类路径就可以。如果我必须以便携和可用的方式打包您的应用程序,我会这样做。