복붙노트

[SPRING] 생성자가 예외를 던졌습니다. 중첩 예외는 java.lang.NoClassDefFoundError입니다. javax / servlet / ServletContext

SPRING

생성자가 예외를 던졌습니다. 중첩 예외는 java.lang.NoClassDefFoundError입니다. javax / servlet / ServletContext

MockMVC로 Junit 테스트를 설정하려고합니다.

이 링크에서 "Servlet API를 사용하지 말아야하며 클래스 경로에 제공해야합니다."

pom.xml에 다음을 추가했지만 작동하지 않았습니다. 어떤 생각?

    <dependency>
        <groupId>javax.servlet</groupId>
        <artifactId>javax.servlet-api</artifactId>
        <version>3.1.0</version>
        <scope>provided</scope>
    </dependency>

여기에 흔적이있다.

org.springframework.beans.BeanInstantiationException: Could not instantiate bean class [org.springframework.test.context.web.WebDelegatingSmartContextLoader]: Constructor threw exception; nested exception is java.lang.NoClassDefFoundError: javax/servlet/ServletContext
    at org.springframework.beans.BeanUtils.instantiateClass(BeanUtils.java:163)
    at org.springframework.beans.BeanUtils.instantiateClass(BeanUtils.java:105)
    at org.springframework.beans.BeanUtils.instantiateClass(BeanUtils.java:130)
    at org.springframework.test.context.ContextLoaderUtils.resolveContextLoader(ContextLoaderUtils.java:118)
    at org.springframework.test.context.ContextLoaderUtils.buildMergedContextConfiguration(ContextLoaderUtils.java:594)
    at org.springframework.test.context.ContextLoaderUtils.buildMergedContextConfiguration(ContextLoaderUtils.java:560)
    at org.springframework.test.context.TestContext.<init>(TestContext.java:99)
    at org.springframework.test.context.TestContextManager.<init>(TestContextManager.java:117)
    at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.createTestContextManager(SpringJUnit4ClassRunner.java:119)
    at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.<init>(SpringJUnit4ClassRunner.java:108)
    at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
    at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:57)
    at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
    at java.lang.reflect.Constructor.newInstance(Constructor.java:526)
    at org.junit.internal.builders.AnnotatedBuilder.buildRunner(AnnotatedBuilder.java:31)
    at org.junit.internal.builders.AnnotatedBuilder.runnerForClass(AnnotatedBuilder.java:24)
    at org.junit.runners.model.RunnerBuilder.safeRunnerForClass(RunnerBuilder.java:57)
    at org.junit.internal.builders.AllDefaultPossibilitiesBuilder.runnerForClass(AllDefaultPossibilitiesBuilder.java:29)
    at org.junit.runners.model.RunnerBuilder.safeRunnerForClass(RunnerBuilder.java:57)
    at org.junit.internal.requests.ClassRequest.getRunner(ClassRequest.java:24)
    at com.intellij.rt.execution.junit.JUnitStarter.main(JUnitStarter.java:63)
Caused by: java.lang.NoClassDefFoundError: javax/servlet/ServletContext
    at org.springframework.test.context.web.WebDelegatingSmartContextLoader.<init>(WebDelegatingSmartContextLoader.java:36)
    at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
    at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:57)
    at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
    at java.lang.reflect.Constructor.newInstance(Constructor.java:526)
    at org.springframework.beans.BeanUtils.instantiateClass(BeanUtils.java:148)
    ... 22 more
Caused by: java.lang.ClassNotFoundException: javax.servlet.ServletContext
    at java.net.URLClassLoader$1.run(URLClassLoader.java:366)
    at java.net.URLClassLoader$1.run(URLClassLoader.java:355)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.net.URLClassLoader.findClass(URLClassLoader.java:354)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
    at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:308)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
    ... 28 more`enter code here`

좋아, 코멘트에 따라 업데이 트되었습니다, 그래서 나는 클래스의 문제를 통과 찾지 못했습니다 컴파일하는 범위를 변경!

    <dependency>
        <groupId>javax.servlet</groupId>
        <artifactId>javax.servlet-api</artifactId>
        <version>3.1.0</version>
        <scope>compile</scope>
    </dependency>

해결법

  1. ==============================

    1.일반적인 문제입니다. Aniket Thakur가 말했듯이, 컨테이너는 런타임에 모든 Java 서블릿 클래스를 제공합니다. 그러나 검사를하는 동안 항아리가 필요합니다.

    일반적인 문제입니다. Aniket Thakur가 말했듯이, 컨테이너는 런타임에 모든 Java 서블릿 클래스를 제공합니다. 그러나 검사를하는 동안 항아리가 필요합니다.

    pom에 추가 한 종속성은 API 일 뿐이며 모든 것을 선언하지만 구현이 포함되어 있지 않습니다. 그래서 도움이되지 않습니다. 어쨌든, 당신은 "제공한다"고 선언합니다. "괜찮습니다, 나는 그것이 classpath에있을 것이라는 것을 알고 있습니다."라고 말했습니다.

    테스트 범위에서 모든 Java EE 클래스의 구현을 가져 오는 종속성을 추가해야합니다. 내 프로젝트에서 나중에 서블릿 컨테이너로 tomcat을 사용하더라도 글래스 피쉬를 사용하지만 같은 문제에 대한 의존성을 찾았습니다.

    <dependency>
        <groupId>org.glassfish</groupId>
        <artifactId>javax.servlet</artifactId>
        <version>3.0</version>
        <scope>test</scope>
    </dependency>
    

    NoClassDefFoundError 문제를 해결해야합니다.

  2. ==============================

    2.클래스는 런타임에 발견되지 않지만 컴파일 타임에 사용할 수 있습니다. 런타임에 찾을 수 있도록 해당 항아리를 추가해야합니다. 나는 일반적으로 아이비를 사용하고 이클립스에서는

    클래스는 런타임에 발견되지 않지만 컴파일 타임에 사용할 수 있습니다. 런타임에 찾을 수 있도록 해당 항아리를 추가해야합니다. 나는 일반적으로 아이비를 사용하고 이클립스에서는

    Project -> Properties ->Deployment Assembly -> Add -> java Build Path Enteries -> Ivy -> Finish
    

    Maven에도 비슷한 것이 있어야합니다.

    또한 서버를 실행하기 위해 사용하는 컨테이너가 런타임에 실제 API를 제공하므로 컴파일하는 동안에 만 javax.servlet-api가 필요합니다.

  3. from https://stackoverflow.com/questions/24393684/constructor-threw-exception-nested-exception-is-java-lang-noclassdeffounderror by cc-by-sa and MIT license