【问题标题】:Unable to load xml file from a absolute path无法从绝对路径加载 xml 文件
【发布时间】:2013-07-21 11:37:31
【问题描述】:

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

【问题讨论】:

  • 不清楚你的xml文件在哪里。您是尝试从 jar 还是从文件系统加载它?
  • xml 文件存在于 A.jar 的资源文件夹中。该 jar 存在于 C 驱动器中的存储库中。请注意,我已经正确添加了依赖项,并且我能够正确地从项目 B 访问 A.jar 中存在的方法。

标签: java maven-3


【解决方案1】:

如果 A 类(捆绑在您的 A.jar 中)想要从 jar 中加载 xml,并尝试以您的第一个代码示例中所示的方式访问它,那么它 不会访问 @987654321 @ 在你的罐子里。它访问该位置的文件

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

【讨论】:

  • 我尝试使用 getClass().getResource(xmlAbsolutePath); 正如你所建议的 现在代码如下所示: File 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() 方法将它作为一个文件。有什么我遗漏的吗,在您提出的上述建议中,我将其作为 InputStream 而不是作为文件
  • 如果你想从 jar 中加载 xml,你不能将它作为 File。我在回答中提到了这一点。你可以通过URL 调用url.openStream() 来做同样的事情。你打算用 xml 做什么?您可能会将它传递给解析器吗?解析器接受InputStream。如果您不清楚如何执行此操作,请编辑您的问题并添加使用您的 xmlFilder() 方法返回的 File 的代码
【解决方案2】:

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

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

通过尝试以文件的形式访问 xml,您的项目在移植到其他系统时非常糟糕。

【讨论】:

  • 我尝试使用 getClass().getResource(xmlAbsolutePath); 现在代码如下所示: File 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 路径
猜你喜欢
  • 2014-10-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-03-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多