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

Java 无法从绝对路径加载xml文件,java,maven-3,Java,Maven 3,有一个maven项目a。一旦我完成mvn清理安装,项目就会构建,jar就可以在我的本地存储库ie中使用 c:\repository\com\stackoverflow\A\A.jar jar包含两个类和这些类使用的xml文件 从另一个maven项目中,我调用了类中使用一个XML文件的一个方法 代码是: public File xmlFilder(String xmlAbsolutePath) { File f = new File(xmlAbsolutePath); return f;

有一个maven项目a。一旦我完成mvn清理安装,项目就会构建,jar就可以在我的本地存储库ie中使用 c:\repository\com\stackoverflow\A\A.jar

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

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

Foo.class.getResource("/thePackagePath/to/p.xml");
通过尝试以文件的形式访问xml,您的项目很难移植到其他系统。

如果a类(捆绑在a.jar中)希望从jar加载xml,并且它尝试以第一个代码示例中所示的方式访问它,那么它就不会访问jar中的
p.xml
。它访问该位置的文件

这是很容易测试,如果这是你的情况。创建jar后,从文件系统中临时删除
p.xml
,并运行一个类。它将无法加载它

当类需要加载绑定在jar中的资源时,它不使用
文件
,而是使用类加载器

根据您提供的名称,我假设您的类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");

不清楚xml文件在哪里。您是从jar还是从文件系统加载它?xml文件存在于A.jar的resources文件夹中。jar存在于C驱动器中的存储库中。请注意,我已经正确添加了依赖项,并且能够从项目B正确访问A.jar中的方法;现在代码如下所示:文件f=null;请尝试{URL resourceFile=getClass().getResource(xmlAbsolutePath);if(resourceFile!=null){f=new File(resourceFile.toURI());System.out.println(“文件存在-----+f.EXISTS());}}}catch(URISyntaxException e){e.printStackTrace();}返回f;但是在调试路径时,我得到了如下结果:jar:file:\C:\repository\com\stackOverflow\A.jar\com\stackOverflow\A\resources\p.xml。有人能告诉我为什么存在“!”URI路径解释了“!”的原因吗我尝试使用getClass().getResource(xmlAbsolutePath);正如您现在所建议的,代码如下所示:文件f=null;请尝试{URL resourceFile=getClass().getResource(xmlAbsolutePath);if(resourceFile!=null){f=new File(resourceFile.toURI());System.out.println(“文件存在-----+f.EXISTS());}}}catch(URISyntaxException e){e.printStackTrace();}返回f;但是在调试路径时,我得到了如下结果:jar:file:\C:\repository\com\stackOverflow\A.jar\com\stackOverflow\A\res‌​ources\p.xml。你知道为什么“!”出现在URI路径中导致我的问题吗?我猜这是偶然发布在这里的。我没有建议使用
getResource()
表示法对于jar文件内的路径来说是正常的。请告诉我使用getResource()时是否有任何问题,以及如何删除该文件!符号,以便我可以实际使用代码。我之所以使用getResource()是因为我希望它作为一个文件,我使用toURI()方法将它作为一个文件。在您提出的上述建议中,我将把它作为输入流而不是文件。如果您想从jar加载xml,您不能将它作为
文件。我在回答中提到了这一点。您可以从
URL
调用
URL.openStream()
执行相同的操作。您将如何处理xml?您可能会将其传递给解析器?解析器接受
InputStream
。如果您不清楚如何操作,请编辑您的问题,并添加使用
xmlFilder()
方法返回的
文件的代码