【问题标题】:Open file; try filesystem first, then JARs打开文件;首先尝试文件系统,然后是 JAR
【发布时间】:2011-04-18 22:25:12
【问题描述】:

我正在尝试让我的应用程序透明地加载资源(二进制文件):

如果文件存在于当前目录下,打开它。
如果没有,请尝试查看当前的 JAR 文件(如果适用)。
如果没有,请尝试查看其他 JAR 文件。 (这是可选的,我不介意明确指定哪些 JAR 文件。)

到目前为止,我知道 File 会打开一个本地文件,ClassLoadergetResource* 用于 JAR 内容。

有没有将两者结合的类?如果没有,我应该如何自己编写?我应该写一个ClassLoader 来检查本地文件系统吗?使用File? (我对 Java 很陌生,甚至不知道什么是返回的好类型。InputStream?)

谢谢

附: “文件”是指“路径”,例如“数据/texture1.png”。

【问题讨论】:

    标签: java jar classpath classloader


    【解决方案1】:

    如果文件路径位于 jar 前面的类路径上,URLClassLoader 应该能够加载两者并首先尝试文件路径。


    关于你的 cmets:

    【讨论】:

    • 啊,太好了。这可能正是我想要的。
    • 确实如此!不过有一个问题:为什么我似乎不能使用new URL("file:foo.jar!/data")?我似乎根本无法使用!/
    • Err 还有一件事,它似乎更喜欢 JAR 中的文件,不管我给路径的顺序是什么。
    • 感谢您的指点。我可以解决 JAR 相对路径问题,但是首先扫描 JAR 呢?除非我删除 JAR 中的文件,否则我无法访问文件系统上的文件。似乎 URL 搜索顺序总是首先搜索 JAR,无论它是我传递给构造函数的 URL 数组的第一个还是第二个元素。
    • 我会说跳过显式类加载器调用,只配置 tha jar 清单,如另一个问题中所述
    【解决方案2】:

    执行 #1 和 #3 非常容易。执行 #2(仅查看当前 JAR)要困难得多,因为它需要你弄清楚你是什么 JAR

    如果你想先检查文件系统,否则从类路径加载,它会是这样的:

    public java.io.InputStream loadByName(String name) {
      java.io.File f = new java.io.File(name);
      if (f.isFile()) {
        return new FileInputStream(f);
      } else {
        return getClass().getResource(name);
      }
    }
    

    如果您想先从同一个 JAR 文件加载,您需要弄清楚它在哪里。查看Determine which JAR file a class is from 了解有关找出要从中加载资源的 JAR 文件的更多信息。

    【讨论】:

    • 我担心我可能需要这样的功能 :( - 感谢您提供指向另一个问题的指针。
    【解决方案3】:

    当前 jar 文件和当前目录不是 JVM 中的概念,就像您在运行 shell 脚本时一样。您需要指定一个目录用于加载您感兴趣的文件,例如在执行 JVM 时使用系统属性:

    java -Ddirectory.to.scan=/home/aib
    

    然后检索这个属性:

    String dir = System.getProperty("directory.to.scan");
    

    现在谈到 JAR 文件时,当您启动 JVM 时,在类路径中明确指定的所有 JAR 文件都由 ClassLoader 加载。您可以通过以下方式获取特定类的 ClassLoader:

    InputStream is = <Your class>.class.getClassLoader().getResourceAsStream("binary file");
    

    请注意,当前类加载器加载的任何 jar 文件都会被搜索。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-11-02
      • 2021-08-03
      • 2013-03-20
      • 1970-01-01
      • 2015-10-07
      • 2015-06-23
      • 2012-11-19
      • 1970-01-01
      相关资源
      最近更新 更多