今天在maven中实现spring整合junit出现了一个错误:
@RunWith(SpringJUnit4ClassRunner.class)
public class UserServiceTest {
@Test
public void testFindAllUser() {
ApplicationContext ctx=new ClassPathXmlApplicationContext("classpath:spring/applicationContext.xml");
SessionFactory s=ctx.getBean("sessionFactory",SessionFactory.class);
System.out.println(s);
// List<User> users=userService.findAllUser();
// for (User user : users) {
// System.out.println(user);
// }
}
报错:
org.springframework.beans.factory.BeanDefinitionStoreException: IOException parsing XML document from class path resource [spring/applicationContext.xml]; nested exception is java.io.FileNotFoundException: class path resource [spring/applicationContext.xml] cannot be opened because it does not exist...
这个意思就是提示你的applicationContext.xml文件找不到,但是我的spring中明明有applicationContext.xml文件,如下图:
而且因为在web.xml配置了<context-param>
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:spring/applicationContext.xml</param-value>
</context-param>
所以在Server中启动整个项目时,applicationContext.xml是可以加载到的。
但是就是在junit中找不到applicationContext.xml这个配置文件,我在网上找了很多文章都没有找到解决办法,后来我看到一个文章说:
ClassPathXmlApplicationContext[只能读放在WEB-INF/classes目录下的配置文件]
但是maven项目中WEB-INF下面没有classes目录
web项目中的classes目录都是用来存放src目录java文件编译之后的class文件,xml、properties等资源配置文件。而在maven的文件夹结构中,target文件夹就是classes目录,用来存放项目构建后的文件和目录、jar包、war包、编译的class文件。
此处穿插一个知识点:
src不是classpath, WEB-INF下面的classes和lib才是classpath,WEB-INF/ 是资源目录, 客户端不能直接访问。WEB-INF/classes目录存放src目录java文件编译之后的class文件,xml、properties等资源配置文件,这是一个定位资源的入口。引用classpath路径下的文件,只需在文件名前加classpath:所以可以得知:在maven项目中
ApplicationContext ctx=new ClassPathXmlApplicationContext("classpath:spring/applicationContext.xml");
这段代码加载的是target文件夹下的spring/applicationContext.xml文件。
这时就有人会想,既然是加载target文件夹下的spring/applicationContext.xml文件,为什么加载不到呢?
因为target文件夹中没有spring/applicationContext.xml文件。
我感觉这是eclipse的一个bug,修改服务端比如manage层和dao层的项目的时候如果eclipse没有自动编译,则在调试的时候容易出很奇怪的错误,就是明明代码已经改好了,但是debug的时候还是在报错,这就是没有项目没有编译完成造成的,看到的改好的代码没有变成class,因此,服务端的文件改动之后如果发现没有效果的时候要记得问题可能是没有编译,这时候可以使用maven的install命令编译一下;
所以此时只需要install一下,就可以将spring/applicationContext.xml编译进target文件夹。
maven的install的作用
ClassPathXmlApplicationContext路径与classpath之间的关系
IOException parsing XML document from class path resource resource