java踩坑-找不到或无法加载主类(Error: Could not find or load main class)

在spring mvc的单元测试中,就是src/test目录下,我写了一个main方法类。这个代码没有任何错误。但是运行时,就报错了。

1、我试着将代码中,添加一行,然后删除一行,保存后,还是报错。

2、我将这个类放到了别的包目录下,单独运行,发现是OK的。

3、我最后将报错的类,改了名字,保存后,发现可以正常运行,没有报错。

4、我将名字又改了回来,这次发现可以正常运行了。

记录一下,奇怪的坑爹。

java踩坑-web后端获取路径的方法差异及注意点

方法一:

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项目补充:

当我用 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