在Java中加载资源

在Java中加载资源,java,resources,classpath,classloader,Java,Resources,Classpath,Classloader,我有一个Java项目,必须加载诸如声音或图像之类的资源,在我将其导出到jar文件之前,这些资源工作得非常好,在jar文件中,由于无法访问资源,应用程序崩溃。经过一些研究,我发现我应该使用getClass().getClassLoader().getResource()或Class.getResource()。但是在尝试了第一个或第二个函数的所有可能性之后,无论是否使用前导的/,但每次我都得到null,并使用res/images/bg.jpg作为参数。我的项目层次结构如下所示: |src |Ma

我有一个Java项目,必须加载诸如声音或图像之类的资源,在我将其导出到jar文件之前,这些资源工作得非常好,在jar文件中,由于无法访问资源,应用程序崩溃。经过一些研究,我发现我应该使用
getClass().getClassLoader().getResource()
Class.getResource()
。但是在尝试了第一个或第二个函数的所有可能性之后,无论是否使用前导的
/
,但每次我都得到
null
,并使用
res/images/bg.jpg
作为参数。我的项目层次结构如下所示:

|src
 |Main.java
|res
   |images
      |bg.jpg
我在Stack Overflow或Google上找到的解决方案都不适合我。我做错了什么?我应该用什么

编辑


当导出为jar时,我只需右键单击Eclipse上的项目(不使用任何插件),导出并选择runnable jar,并显式地将我的类Main声明为类路径。检查jar文件的内容时,我可以在正确的位置看到资源。

res文件夹应该是src文件夹的子文件夹

|src
  |Main.java
  |res
    |images
       |bg.jpg
虽然标准做法是让布局更接近

|src
  | main
    |java
      |package
        |Main.java
    |resources
      |images
        |bp.jpg

上次类似的事情发生在我身上,是因为我的构建没有将文件复制到jar中。通过列出jar中的文件,可能值得做一次健全性检查:

jar tf /path/to/your.jar

我确实检查了jar文件的内容,以及正确文件夹中的资源。jar肯定在您的类路径上吗?我看到开发人员做的另一件事是以一种他们认为已经用完jar的方式运行代码,但实际上他们正在某个地方运行文件系统。@user26830请显示
jar tf
命令的输出。如果JAR实际上包含一个
res/
文件夹,我会有点惊讶,这意味着您应该使用
“images/bg.jpg”
等等。请尝试以下内容。他们应该允许你从罐子里读东西。另外,一定要把你的资源放在src里面。@LaurentiuL。我确实尝试将我的资源放在src中,但没有解决任何问题。我建议在这里添加更多细节。你没有做任何明显的错误,但是在类加载问题上,你必须知道你在运行什么,你的类路径是什么,东西是如何构建的,它们是如何集成的等等。那么
/images/bg.jpg
@TrevorBrown添加了一些更多的信息,希望它能有所帮助。这不会改变任何事情,我仍然得到null。这个答案假设在构建系统中有行为,OP没有提到正在使用哪个构建系统。使用src/main/java和src/main/resources布局的编辑现在假设OP正在使用maven。如果OP使用的是ant,那么这种布局肯定不是标准做法。@TrevorBrown我只是在使用没有任何插件的Eclipse。如果您使用的是Eclipse运行配置,那么这可能是问题的根源。默认情况下,它不会从您创建的任何JAR运行您的应用程序,也不会在默认情况下将资源移动到您的类路径中。默认的eclipse运行将把您的类(并且只有您的类)构建到一个单独的目录中并从那里运行。