tangguo

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

java

有一个maven项目A。执行mvn全新安装后,将构建项目,并且该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。


阅读 569

收藏
2020-11-28

共1个答案

小编典典

如果A类(捆绑在A.jar中)想要从jar中加载xml并尝试以第一个代码示例中所示的方式访问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");
2020-11-28