有一个maven项目A.一旦我做了mvn clean install,项目构建并且jar在我的本地存储库中可用,即 C:\库\ COM \计算器\ 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。
答案 0 :(得分:2)
如果A类(在你的A.jar中捆绑)想要从jar加载xml并且它试图以你的第一个代码示例中显示的方式访问它,那么它不会访问{{罐子里面的1}} 。它访问该位置的文件。
如果这是您的情况,很容易测试。创建jar后,暂时从文件系统中删除p.xml
并运行A类。它将无法加载它。
当一个类需要加载捆绑在jar中的资源时,它不会使用p.xml
而是使用类加载器。
根据您提供的姓名,我认为您的A类在包中:File
xml文件位于包com.stackoverflow.A
以下所有方法都会使用您的xml加载流
com.stackoverflow.A.res
答案 1 :(得分:1)
我认为你问的是错误的问题。您可能想知道必须访问p.xml
。最好的方法是将A.jar放在类路径上,通过将其指定为"另一个Maven项目"的pom.xml中的依赖项。
在您的代码中,您执行以下操作:
Foo.class.getResource("/thePackagePath/to/p.xml");
通过尝试将xml作为文件访问,您可以将项目非常糟糕地移植到其他系统。