Java 从SpringWeb应用程序中的类路径加载(xml)文件

Java 从SpringWeb应用程序中的类路径加载(xml)文件,java,spring,classpath,Java,Spring,Classpath,我想从我的类路径中获取一个xml文件来解组它,并将其用于测试目的。 我的问题是将其作为输入流获取。 我写了这些行,但我总是得到一个空结果 InputStream is = getClass().getResourceAsStream("WebContent/WEB-INF/classes/testing/"+ COMPLETE_DOCUMENT + ".xml"); 当然,您在方法参数中看到的路径就是指向我的文件的路径。 我尝试了几种组合: WebContent/WEB-INF/classes

我想从我的类路径中获取一个xml文件来解组它,并将其用于测试目的。 我的问题是将其作为输入流获取。 我写了这些行,但我总是得到一个空结果

InputStream is = getClass().getResourceAsStream("WebContent/WEB-INF/classes/testing/"+ COMPLETE_DOCUMENT + ".xml");
当然,您在方法参数中看到的路径就是指向我的文件的路径。 我尝试了几种组合:

WebContent/WEB-INF/classes/testing/
classpath:testing/
classpath*:testing/
但是我总是得到InputStream=null

我甚至试着切换到

 ClassLoader.getResourceAsStream(...)
但什么也没发生。我想通往资源的路径有点错误,但我不知道在哪里。在我的servlet.xml中,我使用类路径中的一些资源来配置PropertyPlaceHolderConfigure或Jaxb2Marshaller,只需使用语法即可

"classpath:folder/file.xsd"
而且它工作得很好。我想从中加载xml的文件夹是上面示例中的一个文件夹的同级文件夹。 我错过了什么

编辑: 我试图遵循SpringClassPathResourceHelper类的方法,但我得到了一个奇怪的行为:正如我之前所说,我已经在启动时通过一些SpringBean从类路径加载了一些资源。如果我在dardo建议的代码中使用这些资源的路径,如下所示:

ClassPathResource cpr = new ClassPathResource("xmlschemas/lrinode.xsd");
InputStream is = cpr.getInputStream();
我仍然收到一个
FileNotFound异常
! 当然,
“xmlschemas/lrinode.xsd”
是启动时成功加载的xsd。即使从应用程序的根开始使用资源的完整路径,它也不起作用


我开始觉得我遗漏了一些琐碎的东西。

你需要一个你没有尝试过的组合:

getClass().getResourceAsStream("/testing/"+ COMPLETE_DOCUMENT + ".xml");
WebContent/WEB-INF/classes
目录应该已经在类路径上


classpath:
语法只有在使用Spring的
ResourceLoader
抽象时才起作用,而不是这样。您在
servlet.xml
中对
classpath:folder/file.xsd
的使用非常困难,因为Spring正在通过一个
ServletContextResourceLoader
传递它,它会自动解析
类路径:

当您用资源名称调用
Class.getResourceAsStream()
时,没有前导斜杠,它假定您正在请求与当前包(即调用方类的包)相关的资源。要使其成为绝对资源路径,您需要在资源名称中添加前导斜杠,例如,在您的示例中,
“/testing/”+COMPLETE\u DOCUMENT+”.xml“

Spring提供了一个名为ClassPathResource的帮助器类

比如:

ClassPathResource cpr = new ClassPathResource("folder/file.xsd");
InputStream is = cpr.getInputStream();
应该有用,希望这有帮助

链接到API文档:

旁注

此外,如果您将其用于测试目的,则可能需要连接映射到xsd的bean

可能需要研究JAXB封送器


谢谢你的解释,现在雾已经散去了。不幸的是,你建议的解决方案在我的项目中都不起作用。我假设“classes”目录位于classpath中,因为它是由“classpath:”语法定位的,对吗?UH好吧,我承认。我不确定类路径是什么。说起来很尴尬。我假设它是我在PackageExplorer中从eclipse项目的根目录中所能看到的一切。我知道这是一个变量,但我认为eclipse会自动管理它…@maVVamaldo:确保在路径中包含前导斜杠。我在最初的回答几秒钟后补充说。为了完整起见,这正是我尝试的代码片段。InputStream=getClass().getResourceAsStream(“/testing/”+COMPLETE_DOCUMENT+”.xml”);谢谢,我对这个助手班很感兴趣。我尝试了您的解决方案,但仍然得到
“java.io.FileNotFoundException:无法打开类路径资源[testing/sample\u complete\u document.xml],因为它不存在”
异常。文件名是我的类路径中文件的实际名称。另外,我已经在使用JAXB2了,如果xml文档的完整路径是什么?xml文档的完整路径如下:
/VirtualResource2/WebContent/WEB-INF/classes/testing/sample\u complete\u document.xml
。当然,“VirtualResource2”是我的web应用程序的名称。编译前的路径是什么?我应该问一下,如果编译前它在web inf文件夹下,对类路径不可见。如果您使用的是maven,请将它放在src/main/resources/test.xml中,那么它将是新的类路径资源(“test.xml”)