繁体   English   中英

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

[英]Unable to load xml file from a absolute path

有一个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并尝试以第一个代码示例中显示的方式访问它,那么它就不会访问jar中的p.xml 它访问该位置文件

如果这是你的情况,很容易测试。 创建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");

我想你问的是错误的问题。 您可能想知道必须访问p.xml 最好的方法是将A.jar放在类路径上,通过在“其他Maven项目”的pom.xml中将其指定为依赖项来实现。 在您的代码中,您执行以下操作:

Foo.class.getResource("/thePackagePath/to/p.xml");

通过尝试将xml作为文件访问,您可以将项目非常糟糕地移植到其他系统。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM