我正在测试如何表达资源文件的路径。我在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的根test.txt
,用户位于TestRes.class
文件夹答案 0 :(得分:0)
从Eclipse运行时,IDE通过映射到src和bin文件夹上的基本文件系统操作来模拟运行时类加载器行为。在所有极端情况下,模拟行为可能与实际运行时行为不完全匹配。在这种特殊情况下,模拟器看起来并没有阻止使用运行时不支持的路径。