有一个 maven 项目 A。一旦我执行 mvn clean install,项目就会构建并且 jar 在我的本地存储库中可用,即 c:\repository\com\stackoverflow\A\A.jar
A.jar 包含几个类和这些类使用的 xml 文件
我正在从另一个 Maven 项目调用使用一个 XML 文件的类中的方法之一。
代码是:
public File xmlFilder(String xmlAbsolutePath) {
File f = new File(xmlAbsolutePath);
return f;
}
第二个项目位于我的D盘。在获取绝对路径时,我得到的是 \com\stackoverflow\A\res\p.xml 这是正确的绝对路径。
但是如果我在第 3 行添加以下代码,我将得到如下结果:
public File xmlFilder(String xmlAbsolutePath) {
File f = new File(xmlAbsolutePath);
System.out.println("AbsolutePath----"+f.getAbsolutePath()); ---> D:\com\stackoverflow\A\res\p.xml
System.out.println("getPath------------"+f.getPath()); ---> \com\stackoverflow\A\res\p.xml
System.out.println("exists--------------"+f.exists()); ----> false
return f;
}
任何人都可以让我知道我要去哪里错了。为什么它不从 C 驱动器中存在的存储库中选择 xml。
最佳答案
如果 A 类(捆绑在您的 A.jar 中)想要从 jar 加载 xml 并尝试以第一个代码示例中显示的方式访问它,那么它不会访问 p.xml
在你的 jar 中。它访问该位置的文件。
很容易测试这是否是您的情况。创建 jar 后,暂时从文件系统中删除 p.xml
并运行 A 类。它将无法加载它。
当类需要加载捆绑在 jar 中的资源时,它不使用 File
,而是使用类加载器。
根据您提供的名称,我假设您的类 A 在包中:com.stackoverflow.A
xml 文件位于 com.stackoverflow.A.res
下面的所有方法都将使用您的 xml 加载流
InputStream is = null;
// Using class - relative to the class location because path does not start with "/"
is = SimpleWriter.class.getResourceAsStream("res/p.xml");
// Using class - absolute path because path starts with "/"
is = SimpleWriter.class.getResourceAsStream("/com/stackoverflow/A/res/p.xml");
// Using classloader - path is *always* absolute. Note that leading "/" is missing
is = SimpleWriter.class.getClassLoader().getResourceAsStream("com/stackoverflow/A/res/p.xml");
关于java - 无法从绝对路径加载 xml 文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17771919/