【问题标题】:referencing data files in jars引用 jar 中的数据文件
【发布时间】:2010-09-29 02:55:25
【问题描述】:

我的 Java 程序引用了很多数据文件。我将它们与 src/ 和 bin/ 一起放在名为 data/ 的顶级目录中。在 Eclipse 中,对 data/ 和 ../data/ 的引用似乎都有效。当我从命令行运行它时,只有 ../data/ 有效。

当我将 bin/ 和 data/ 目录放入 jar 并正确设置入口点时,它似乎并不知道我希望它访问 jar inside jar 中的 data/ 目录.我能够让它工作的唯一方法是将引用设置为 ../data/ 并将 jar 放在 bin 目录中。这显然对我没有任何好处,因为它不是独立的。

我需要对引用做些什么才能使它们起作用?

谢谢

【问题讨论】:

    标签: java classpath executable-jar


    【解决方案1】:

    我建议您以相对于类路径的方式访问这些文件,无论是在 Eclipse 中还是在已编译的 JAR 中。

    您可能会采用几种方法,但仅 JDK 的基本方法是使用 Class 的 getResourceAsStream() 方法,让您可以访问可以读取的 InputStream 对象。

    【讨论】:

      【解决方案2】:

      如果你的资源在 jar 文件中,请考虑使用这种方法来读取它们:

      class Class {
          InputStream getResourceAsStream(String name)
      }
      

      这会查找相对于类(可能在 jar 中)而不是相对于工作目录的资源。

      【讨论】:

        【解决方案3】:

        感谢您为我指明这条路,伙计们。我最终做了一个非常糟糕的解决方法,因为我对 IO 还不是很好。我使用 getClass() 构造了一个 URL:

        http://forums.sun.com/thread.jspa?threadID=5258488

        然后从这个字符串创建一个新的文件对象(新文件(文件)):

        字符串文件 = url.toString().replaceFirst("file:", "");

        这让我可以保留引用文件对象的相同代码。

        【讨论】:

        • 编辑:这不适用于罐子。请参阅:forum.springsource.org/archive/index.php/t-65452.html 显然,我必须重新执行所有以文件为中心的代码(扫描仪对象等)才能使用 URL 等。啊,好吧。
        • 我强烈建议使用Class#getResource() / getResourceAsStream() 而不是像那样在黑暗中射击/黑客/摆弄。
        猜你喜欢
        • 2012-07-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-03-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多