Java:从文件系统加载资源

Java:从文件系统加载资源,java,file-io,resources,Java,File Io,Resources,我的项目设置 我有以下项目设置: \program.jar \images\logo.png 在我的代码中,我使用相对URL“images/logo.png”引用图像 问题 如果在目录中使用以下命令运行此程序: c:\projects\program_dir\bin\>java -jar program.jar 然后一切正常,Java能够定位图像 现在,我的问题是,我需要能够从不同的目录运行程序 c:\>java -jar c:\projects\program_dir\bi

我的项目设置

我有以下项目设置:

\program.jar  
\images\logo.png
在我的代码中,我使用相对URL
“images/logo.png”
引用图像

问题

如果在目录中使用以下命令运行此程序:

c:\projects\program_dir\bin\>java -jar program.jar
然后一切正常,Java能够定位图像

现在,我的问题是,我需要能够从不同的目录运行程序

c:\>java -jar c:\projects\program_dir\bin\program.jar
程序已执行,但现在所有相关URL都不再工作

我需要什么


如何计算program.jar文件的执行主页,以便将相对URL更改为绝对URL?

如果可能,我会将图像打包到jar中

这样,您就不必担心Jar从何处启动

然后,您需要加载类似以下内容的图像:

InputStream stream = this.getClass().getClassLoader().
                                     getResourceAsStream("/images/logo.png");

资源必须位于类路径中。您可以尝试以下方法之一:

  • 将图像放入
    程序.jar
  • 与大多数程序一样,它们有一个
    APP\u HOME
    目录,例如
    MAVEN\u HOME
    ,将其注册并将您的文件称为
    File
    -
    $APP\u HOME/File.ext
    (使用
    System.getenv()

  • 你真的应该把你的资源包括在你的罐子里

    如果做不到这一点,您可以解析出主类资源的绝对路径。假设您的主类实际上被称为“Main”:


    正如Nelson提到的,用JAR打包它们(只需将它们与.class文件一起复制),然后您就可以通过一个简单的
    this.getClass().getClassLoder().getResource(“images/foo.png”)
    找到它们。您需要添加一个描述类路径的参数。应该看起来像

    java -cp c:\projects\program_dir\bin -jar program.jar
    

    这将把您的jar和映像放在类路径上,它将成功加载。

    +1利用类路径加载静态资源。另请参见:,这实际上是false():
    -jar使用此选项时,jar文件是所有用户类的源,其他用户类路径设置将被忽略。
    java -cp c:\projects\program_dir\bin -jar program.jar