【问题标题】:Java: Loading resources from the file systemJava:从文件系统加载资源
【发布时间】:2011-03-19 13:13:40
【问题描述】:

我的项目设置

我有以下项目设置:

\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?

【问题讨论】:

    标签: java file-io resources


    【解决方案1】:

    如果可能的话,我会做的是将您的图像与您的 Jar 一起打包。

    这样你就不必担心你的 Jar 是从哪里启动的。

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

    InputStream stream = this.getClass().getClassLoader().
                                         getResourceAsStream("/images/logo.png");
    
    【解决方案2】:

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

    1. 将图像放入program.jar
    2. 像大多数程序一样,它们有一个APP_HOME 目录,例如MAVEN_HOME,注册它并将您的文件称为File,而不是$APP_HOME/the-file.ext(使用System.getenv())。

    【讨论】:

      【解决方案3】:

      你真的应该在你的 JAR 中包含你的资源。

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

      Main.class.getResource("Main.class").getPath();
      

      【讨论】:

        【解决方案4】:

        正如 Nelson 所说,将它们与您的 JAR 一起打包(只需将它们与您的 .class 文件一起复制),然后您可以通过简单的this.getClass().getClassLoder().getResource("images/foo.png") 找到它们。

        【讨论】:

          【解决方案5】:

          您需要添加一个描述您的类路径的参数。应该看起来像

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

          这会将你的 jar 和图像放在类路径上,它会成功加载。

          【讨论】:

          • 这实际上是错误的(java documentation):-jar When you use this option, the JAR file is the source of all user classes, and other user class path settings are ignored.
          猜你喜欢
          • 1970-01-01
          • 2013-11-16
          • 1970-01-01
          • 1970-01-01
          • 2014-02-24
          • 2010-09-12
          • 2010-11-13
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多