在spring mvc的单元测试中,就是src/test目录下,我写了一个main方法类。这个代码没有任何错误。但是运行时,就报错了。
1、我试着将代码中,添加一行,然后删除一行,保存后,还是报错。
2、我将这个类放到了别的包目录下,单独运行,发现是OK的。
3、我最后将报错的类,改了名字,保存后,发现可以正常运行,没有报错。
4、我将名字又改了回来,这次发现可以正常运行了。
记录一下,奇怪的坑爹。
当你年老时,你是否常常想,要是年轻时多努力下该好。
在spring mvc的单元测试中,就是src/test目录下,我写了一个main方法类。这个代码没有任何错误。但是运行时,就报错了。
1、我试着将代码中,添加一行,然后删除一行,保存后,还是报错。
2、我将这个类放到了别的包目录下,单独运行,发现是OK的。
3、我最后将报错的类,改了名字,保存后,发现可以正常运行,没有报错。
4、我将名字又改了回来,这次发现可以正常运行了。
记录一下,奇怪的坑爹。
String path = Test.class.getResource("/").toString(); System.out.println("path = " + path);
此方法在tomcat下面没有问题,可以取到WEB-INF/classes
path = file:/home/ngidm_db2/AS_Tomcat7_0_29/webapps/NGIDM/WEB-INF/classes/
但换weblogic之后,取到的为
path = file:/oracle/weblogic/Oracle/Middleware/Oracle_Home/user_projects/domains/base_domain/
在weblogic下面,没能拿到classes路径。
String path2 = Thread.currentThread().getContextClassLoader().getResource("/").getPath(); System.out.println("path2 = " + path2);
在tomcat和weblogic下面均可取到classes路径
path2 = /oracle/weblogic/Oracle/Middleware/user_apps/NGIDM/WEB-INF/classes/
path2 = /home/ngidm_db2/AS_Tomcat7_0_29/webapps/NGIDM/WEB-INF/classes/
故建议大家多使用
Thread.currentThread().getContextClassLoader().getResource("/").getPath();
获取classpath路径,且方法2 取到的classpath不含file:前缀,可以直接使用。
但是方法二,在JDK 7 和JDK8中会报错 返回 null ,所以要稍微改一下:
要么改成:Thread.currentThread().getContextClassLoader().getResource(".").getPath()
要么改成:Thread.currentThread().getContextClassLoader().getResource("").getPath()
当我用 eclipse 构建 Maven 的Web项目时,然后用Junit 单元测试,调用如下方法获取路径
Thread.currentThread().getContextClassLoader().getResource("").getPath()
获取到的路径是 :xxx/target/test-classes/
而期望的是 xxx/target/classes/
所以有问题。
因为test-classes
文件夹内没有存放任何 class 文件,所有class 文件和配置文件都存放在classes
文件夹内。所以正在执行的测试类,应该是在 classes
文件夹中。
原因是maven项目的目录问题:src/main/java/
目录下的代码会存放到target/classes
文件夹下,src/test/java/
目录下的代码会存放到target/test-classes
文件夹下。同理:src/main/resources
目录下的文件也会存放到 target/classes
文件夹下。
@Test public void testCRUD() throws IOException{ //下面这句话,加载的配置文件路径是 xxx/target/test-classes/log4j.xml 结果 找不到, 因为真正的路径是 xxx/target/classes/log4j.xml //PropertyConfigurator.configure(Thread.currentThread().getContextClassLoader().getResource("").getPath()+"log4j.xml"); //因为无法正确加载路径,所以采取了 另一种 路径方法 String config=System.getProperty("user.dir");//获取程序的当前路径 System.out.println("config="+config); PropertyConfigurator.configure(config+"/target/classes/log4j.xml"); // Log4j的 调用方法,版本是 1.X 的, 因为 log4j 2.x 的版本 ,配置文件和调用方法 都变不同了。 // Logger logger = Logger.getLogger(MapperTest.class); // // 记录debug级别的信息 // logger.error("This is debug message."); //1、创建SpringIOC容器 ,这个地方 却可以 正确加载 路径 xxx/target/classes/springIOC.xml ApplicationContext ioc = new ClassPathXmlApplicationContext("springIOC.xml"); //2、从容器中获取mapper EmployeeMapper bean = ioc.getBean(EmployeeMapper.class); System.out.println(bean.selectByPrimaryKey(1)); }
参考自:https://blog.csdn.net/magi1201/article/details/18731581