Spring实例化bean时抛出NoClassDefFoundError

时间:2014-10-22 16:50:37

标签: java spring

我有一个春豆。

@Component
public class Omg {

    public void omg() throws IOException {
        HttpServletRequest request = null;
        InputStream is = request.getInputStream();
        is.read();
    }

}

我没有在servlet容器中使用它。 这仅仅是为了举例。

ApplicationContext context = new ClassPathXmlApplicationContext("spring.xml");

此行抛出异常java.lang.NoClassDefFoundError: javax/servlet/ServletInputStream. Servlet api在运行时的类路径中。好的,我知道当omg方法运行时应该抛出NoClassDefFoundError。问题是:当spring尝试实例化bean以及为什么ServletInputStream而不是HttpServlerRequest时,为什么会抛出它?

Exception in thread "main" java.lang.NoClassDefFoundError: javax/servlet/ServletInputStream
    at java.lang.Class.getDeclaredConstructors0(Native Method)
    at java.lang.Class.privateGetDeclaredConstructors(Class.java:2532)
    at java.lang.Class.getDeclaredConstructors(Class.java:1901)
    at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.determineCandidateConstructors(AutowiredAnnotationBeanPostProcessor.java:234)

更新: 但是这很好用

public class A {}

public class B {

    public void method() {
        A a = new A();
    } 

}

public class C {

    public static void main(String[] args) {
        B b = new B();
    }

}

编译所有三个类。删除A.class。运行C类的main方法。它工作正常。

1 个答案:

答案 0 :(得分:0)

  

公共类NoClassDefFoundError扩展了LinkageError

     

如果Java虚拟机或ClassLoader实例尝试,则抛出该异常   加载类的定义(作为普通方法调用的一部分或   作为使用新表达式创建新实例的一部分)和否   可以找到班级的定义。

public class A {}

public class B {
  public void m(A a) {
  }

  public static void main(String[] args) {
     B b = new B();
  }
}

javac A.java // OK

javac B.java // OK

// remove A.class

java B

Exception in thread "main" java.lang.NoClassDefFoundError: A
        at java.lang.Class.getDeclaredMethods0(Native Method)
        at java.lang.Class.privateGetDeclaredMethods(Unknown Source)
        at java.lang.Class.getMethod0(Unknown Source)
        at java.lang.Class.getMethod(Unknown Source)