这是令人难以置信的......当我在包含文本文件的打包JAR文件上运行Java时,我可以使getResource()和getResourceAsStream()正常工作。 (供参考,请参阅accessing resources上的Sun文档)当我在Eclipse中运行它时,我似乎无法使相同的程序正常工作,即使我已将我的文本文件放在与编译器相同的树中.class文件
您是否可以指出我的任何细微之处,以确保getResource()和getResourceAsStream()函数正常工作?
我有预感它与CLASSPATH和/或Eclipse将.class文件自动编译。 (我注意到当我运行Ant时,它会编译自上次Ant构建以来已经更改的所有Java文件,即使Eclipse已经编译了这些Java文件。)
答案 0 :(得分:16)
一些注意事项:
首先 - 正如Chocos所说,把它放在日食源dirs中,而不是二进制dirs中。当您“清理”时,Eclipse将清除二进制目录,以及清理不匹配的文件。它会将非java源文件复制到二进制目录。
这意味着即使您将文件放在二进制目录中,也可能会被eclipse删除...
请记住,getResourceAsStream和getResource相对于调用它们的代码包进行操作。例如:
package a.b.c;
public class Foo {
...
getClass().getClassLoader().getResourceAsStream("fee.txt");
...
}
这实际上是寻找a / b / c / fee.txt;包装是预先填写的。如果您在与Foo.java文件相同的源目录中具有fee.txt,或者如果在具有相同目录结构的类路径上有一组单独的资源目录,则此方法很有效。
如果您使用
...getResourceAsStream("/fee.txt");
它将直接在类路径上查找fee.txt。
从命令行运行时,JAR中的哪个位置是资源文件? - 斯科特
答案 1 :(得分:10)
如果您将文本文件与源文件一起放入,Eclipse会将其复制到放置其编译的.class文件的位置,因此当您从Eclipse运行应用程序时,您将看到您的文本文件(并且您将成为能够在Eclipse中编辑文件。)
答案 2 :(得分:2)
发现问题!
我确实在源树中包含了我的图片文件。 (在我的Ant构建中,我将它们复制到构建目录)
问题是我最近没有在Eclipse中刷新源代码树。所以这些文件都存在,但是Eclipse没有注意它们。
感谢您让我了解Eclipse应该在我的源代码树中拥有它们。
答案 3 :(得分:1)
我有预感它与CLASSPATH和/或Eclipse将.class文件自动编译。
在“运行配置”中,您要启动应用程序,请转到“类路径”选项卡,然后添加用于访问该文件的路径的根文件夹。
因此,例如,如果您尝试加载“blah / file.txt”并且文件位于“folder / blah / file.txt”中,请将“folder”添加到类路径中。如果您尝试仅使用“file.txt”加载资源,则添加“folder / blah”。
答案 4 :(得分:1)
我在IntelliJ中遇到了同样的问题,解决方法是,在项目设置中,添加包含资源文件的文件夹,在我的案例中是声音文件,作为源。在Settings->编译器资源模式中添加?*。wav(或您的pref文件类型)。
答案 5 :(得分:0)
“正常工作”究竟是什么意思?什么是错误/行为?
我建议使用getResource
查找您的.class
个文件的网址(或大致相当于getClass().getProtectionDomain().getCodeSource()
。您可能会发现它指向某处意外。