今天想写个随笔,最近经常遇到使用junit的时候报java.lang.NoClassDefFoundError,今天算是恍然大悟了,原来junit虽然在gradle里面配置了,也在Project and External Dependencies中看到了junit的jar包,并能在这个junit的jar包里面找到org/junit/runner/manipulation/Filter这个类,但是run as junit test的时候就偏偏要报java.lang.NoClassDefFoundError: org/junit/runner/manipulation/Filter。
以为是gradle配置问题,testImplementation、implementation、api都不行
后来想想,出现这种情况无外乎gradle中引入的jar包(即Project and External Dependencies中的jar包)在run as junit test的时候并没有被jvm加载,所以才会出现这种现象,解决办法就是在build path 中add library,加入junit
下面附上在main里面打出已加载的class:
package proxy; import java.lang.reflect.Field; import java.lang.reflect.Proxy; import java.util.Vector; import org.junit.Test; /** * Created by 136187300@qq.com on 2018年6月9日. */ public class TestProxy { @Test public void test1() { TestLog testLog = new TestLogImpl(); TestLogInterceptor testLogInterceptor = new TestLogInterceptor(); testLogInterceptor.setTarget(testLog); TestLog proxy = (TestLog)Proxy.newProxyInstance(testLog.getClass().getClassLoader() , testLog.getClass().getInterfaces(), testLogInterceptor); proxy.print(); } public static void main(String[] args) { TestLog testLog = new TestLogImpl(); TestLogInterceptor testLogInterceptor = new TestLogInterceptor(); testLogInterceptor.setTarget(testLog); TestLog proxy = (TestLog)Proxy.newProxyInstance(testLog.getClass().getClassLoader() , testLog.getClass().getInterfaces(), testLogInterceptor); proxy.print(); try { new TestProxy().printClass(); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } } public void printClass() throws Exception { ClassLoader classLoader = Thread.currentThread().getContextClassLoader(); Class cla = classLoader.getClass(); while (cla != ClassLoader.class) cla = cla.getSuperclass(); Field field = cla.getDeclaredField("classes"); field.setAccessible(true); Vector v = (Vector) field.get(classLoader); for (int i = 0; i < v.size(); i++) { System.out.print(((Class)v.get(i)).getName()+","); if(i%10 == 0)System.out.println(""); } } }