Java 无法从绝对路径加载xml文件
有一个maven项目a。一旦我完成mvn清理安装,项目就会构建,jar就可以在我的本地存储库ie中使用 c:\repository\com\stackoverflow\A\A.jar jar包含两个类和这些类使用的xml文件 从另一个maven项目中,我调用了类中使用一个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;
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\resources\p.xml。你知道为什么“!”出现在URI路径中导致我的问题吗?我猜这是偶然发布在这里的。我没有建议使用
getResource()
。代码>表示法对于jar文件内的路径来说是正常的。请告诉我使用getResource()时是否有任何问题,以及如何删除该文件!符号,以便我可以实际使用代码。我之所以使用getResource()是因为我希望它作为一个文件,我使用toURI()方法将它作为一个文件。在您提出的上述建议中,我将把它作为输入流而不是文件。如果您想从jar加载xml,您不能将它作为文件。我在回答中提到了这一点。您可以从URL
调用URL.openStream()
执行相同的操作。您将如何处理xml?您可能会将其传递给解析器?解析器接受InputStream
。如果您不清楚如何操作,请编辑您的问题,并添加使用xmlFilder()
方法返回的文件的代码