【发布时间】:2014-07-20 11:54:47
【问题描述】:
我正在测试如何表达资源文件的路径。我在 Eclipse 和带有 jar 的命令行之间得到了不同的结果。
您能帮我理解为什么会有差异吗?
我有两个资源文件:
- 一个在类包中,与类文件处于同一级别。
- 一个在类包外,与包同级。
日食。这确实有效:
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() 返回 null第二种情况("../../../test.txt")和第三种情况(".")。
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位于 jar 的根目录 - 根目录下还有 3 个附加文件(类路径、项目和清单)
-
TestRes.class和用户在com\example\mypackage文件夹中
【问题讨论】:
标签: java eclipse jar resources