class.getResource in-Eclipse vs in-jar中的unconsistant行为

时间:2014-05-30 16:34:59

标签: java eclipse jar resources

我正在测试如何表达资源文件的路径。我在Eclipse和命令行之间得到了不同的结果。

你能帮我理解为什么会有差异吗?

我有两个资源文件:

  • 一个在类包中,与类文件处于同一级别。
  • 一个在类包之外,与包相同。

的Eclipse。这确实有效:

package com.example.mypackage;

/*    FileIO (project)
 *      |
 *      +---- src (source folder)
 *             |
 *             +---- com.example.mypackage (package)
 *             |              |
 *             |              +---- TestRes.java (class)
 *             |              |
 *             |              +---- users (resource file 1)
 *             |
 *             +---- test.txt (resource file 2)
 */

public class TestRes {
    public static void main(String[] args) {
        // Some resource names (relative, absolute)
        String[][] res = {
            { "users"            , "/com/example/mypackage/users" },
            { "../../../test.txt", "/test.txt" },
            { "."                , "/com/example/mypackage/" }
        };

        // Get resource URL
        String f = "Relative: %s\nAbsolute: %s\nURL: %s (%s)\n\n";
        for (String[] r : res) {
            String n0 = r[0];
            String n1 = r[1];
            try {
                String url0 = TestRes.class.getResource(n0).getPath();
                String url1 = TestRes.class.getResource(n1).getPath();
                System.out.printf(f, n0, n1, url0, (url0.equals(url1)));
            }
            catch (Exception e) { e.printStackTrace(); }
        }
    }
}

输出:

Relative: users
Absolute: /com/example/mypackage/users
URL: /C:/Users/User/workspace/FileIO/bin/com/example/mypackage/users (true)

Relative: ../../../test.txt
Absolute: /test.txt
URL: /C:/Users/User/workspace/FileIO/bin/test.txt (true)

Relative: .
Absolute: /com/example/mypackage/
URL: /C:/Users/User/workspace/FileIO/bin/com/example/mypackage/ (true)

但是当我将项目导出到jar(右键单击FileIO,然后export),并在命令行运行带有java.exe的jar时,class.getResource()返回{ {1}}尝试处理第二种情况(null)和第三种情况("../../../test.txt")时。{/ p>

"."

我检查了jar的结构:

  • C:\Users\User\Desktop>java -jar TestRes.jar Relative: users Absolute: /com/example/mypackage/users URL: file:/C:/Users/User/Desktop/TestRes.jar!/com/example/mypackage/users (true) java.lang.NullPointerException at com.example.mypackage.TestRes.main(TestRes.java:31) java.lang.NullPointerException at com.example.mypackage.TestRes.main(TestRes.java:31) 位于jar的根
  • 根目录下有3个附加文件(classpath,project和manifest)
  • test.txt,用户位于TestRes.class文件夹

1 个答案:

答案 0 :(得分:0)

从Eclipse运行时,IDE通过映射到src和bin文件夹上的基本文件系统操作来模拟运行时类加载器行为。在所有极端情况下,模拟行为可能与实际运行时行为不完全匹配。在这种特殊情况下,模拟器看起来并没有阻止使用运行时不支持的路径。