1

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

4

2 回答 2

2

如果 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");
于 2013-07-22T12:11:47.747 回答
1

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

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

通过尝试将 xml 作为文件进行访问,您的项目对于其他系统的可移植性非常糟糕。

于 2013-07-21T17:38:42.497 回答