java - 无法从绝对路径加载 xml 文件

标签 java maven-3

有一个 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/

相关文章:

java - 我的代码输出不正确

java - 无需递归即可获取结构中的文件数

java - else 语法错误

java - 在 Eclipse 中将图像添加到 JButton

maven-3 - Github-actions:缓存 repo 以加速 maven 构建

java - 如何强制 Maven 忽略依赖项 pom.xml 中的 <repository>

Java,Vector不添加字符输入

java - 为什么 Maven 版本会跳过我的子模块

java - 使用公司内部存储库构建 Maven 项目

java - 如何在故障安全中获取失败测试的完整堆栈跟踪?