构造函数抛出异常;嵌套的异常是java.lang.NoClassDefFoundError:javax/servlet/ServletContext

构造函数抛出异常;嵌套的异常是java.lang.NoClassDefFoundError:javax/servlet/ServletContext,java,spring,junit,Java,Spring,Junit,我正在尝试用MockMVC设置Junit测试 由此可知——“要么不能使用Servlet API,要么需要在类路径上提供它” 我在pom.xml中添加了以下内容,但没有起作用。有什么想法吗 <dependency> <groupId>javax.servlet</groupId> <artifactId>javax.servlet-api</artifactId> <versi

我正在尝试用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>

javax.servlet
javax.servlet-api
3.1.0
假如
这是痕迹

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`
org.springframework.beans.BeanInstantiationException:无法实例化bean类[org.springframework.test.context.web.WebDelegatingSmartContextLoader]:构造函数引发异常;嵌套的异常是java.lang.NoClassDefFoundError:javax/servlet/ServletContext
位于org.springframework.beans.BeanUtils.InstanceClass(BeanUtils.java:163)
位于org.springframework.beans.BeanUtils.InstanceClass(BeanUtils.java:105)
位于org.springframework.beans.BeanUtils.InstanceClass(BeanUtils.java:130)
位于org.springframework.test.context.ContextLoaderUtils.resolveContextLoader(ContextLoaderUtils.java:118)
位于org.springframework.test.context.ContextLoaderUtils.buildMergedContextConfiguration(ContextLoaderUtils.java:594)
位于org.springframework.test.context.ContextLoaderUtils.buildMergedContextConfiguration(ContextLoaderUtils.java:560)
位于org.springframework.test.context.TestContext.(TestContext.java:99)
位于org.springframework.test.context.TestContextManager。(TestContextManager.java:117)
位于org.springframework.test.context.junit4.SpringJUnit4ClassRunner.createTestContextManager(SpringJUnit4ClassRunner.java:119)
位于org.springframework.test.context.junit4.SpringJUnit4ClassRunner。(SpringJUnit4ClassRunner.java:108)
位于sun.reflect.NativeConstructorAccessorImpl.newInstance0(本机方法)
位于sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:57)
在sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
位于java.lang.reflect.Constructor.newInstance(Constructor.java:526)
位于org.junit.internal.builders.AnnotatedBuilder.buildRunner(AnnotatedBuilder.java:31)
位于org.junit.internal.builders.AnnotatedBuilder.runnerForClass(AnnotatedBuilder.java:24)
位于org.junit.runners.model.RunnerBuilder.safeRunnerForClass(RunnerBuilder.java:57)
位于org.junit.internal.builders.AllDefaultPossibilityBuilder.runnerForClass(AllDefaultPossibilityBuilder.java:29)
位于org.junit.runners.model.RunnerBuilder.safeRunnerForClass(RunnerBuilder.java:57)
位于org.junit.internal.requests.ClassRequest.getRunner(ClassRequest.java:24)
位于com.intellij.rt.execution.junit.JUnitStarter.main(JUnitStarter.java:63)
原因:java.lang.NoClassDefFoundError:javax/servlet/ServletContext
位于org.springframework.test.context.web.WebDelegatingSmartContextLoader。(WebDelegatingSmartContextLoader.java:36)
位于sun.reflect.NativeConstructorAccessorImpl.newInstance0(本机方法)
位于sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:57)
在sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
位于java.lang.reflect.Constructor.newInstance(Constructor.java:526)
位于org.springframework.beans.BeanUtils.InstanceClass(BeanUtils.java:148)
... 还有22个
原因:java.lang.ClassNotFoundException:javax.servlet.ServletContext
在java.net.URLClassLoader$1.run(URLClassLoader.java:366)
在java.net.URLClassLoader$1.run(URLClassLoader.java:355)
位于java.security.AccessController.doPrivileged(本机方法)
位于java.net.URLClassLoader.findClass(URLClassLoader.java:354)
位于java.lang.ClassLoader.loadClass(ClassLoader.java:424)
位于sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:308)
位于java.lang.ClassLoader.loadClass(ClassLoader.java:357)
... 28更多`请在此处输入代码`
好的,根据评论更新,所以我改变了编译的范围,然后似乎通过类未找到的问题

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

javax.servlet
javax.servlet-api
3.1.0
编译

类在运行时找不到,但在编译时可用。您需要添加相应的jar,以便在运行时找到它。我通常使用常春藤,在Eclipse中使用常春藤

Project -> Properties ->Deployment Assembly -> Add -> java Build Path Enteries -> Ivy -> Finish
马文也一定有类似的经历


此外,您只需要在编译时使用
javax.servlet api
,因为用于运行服务器的容器将在运行时提供实际的api。

这是一个常见问题。正如Aniket Thakur所说,该容器将在运行时提供所有Java servlet类。但是在测试过程中,您需要一个罐子来提供它们

添加到pom中的依赖项只是API:它声明了所有内容,但不包含任何实现。所以这不会有帮助。无论如何,您将它声明为“provided”,这对maven说“别担心,我知道它将在类路径上”

您必须添加一个依赖项,使所有JavaEE类的实现都在
test
范围内。在我的项目中,我使用glassfish,即使后来我使用tomcat作为servlet容器,但我曾经发现谷歌搜索的依赖性也存在同样的问题:

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

玻璃鱼
javax.servlet
3
测试

它应该可以解决您的
NoClassDefFoundError
问题。

检查是否正在下载servlet依赖项。尝试使用
mvn dependency:copy dependencies-Dclassifer=directory
将所有依赖项下载到一个单独的文件夹中,并查看它们是否都使您可以将
添加到测试配置文件中。