有一个maven项目A。执行mvn全新安装后,将构建项目,并且该jar在我的本地存储库中可用,即c:\ repository \ com \ stackoverflow \ A \ A.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并尝试以第一个代码示例中所示的方式访问xml,那么它将无法p.xml在jar中访问。它访问该位置的文件。
A.jar
p.xml
很容易测试是否属于您的情况。创建jar之后,暂时p.xml从文件系统中删除并运行A类。它将无法加载。
当类需要加载捆绑在jar中的资源时,它不使用,File而是使用类加载器。
根据您提供的名称,我假设您的类A在软件包中:com.stackoverflow.A xml文件在软件包中com.stackoverflow.A.res
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");