Maven依赖关系javax.servlet必须包含在POM中,用于新的构建服务器

时间:2014-04-11 11:23:04

标签: java maven servlets

我有一个新的nexus服务器和一个新的构建服务器。我mvn打包一个项目,并在进入测试阶段时收到以下错误:

org.mule.api.registry.RegistrationException: Failed to invoke lifecycle phase "initialise" on object: org.mule.config.bootstrap.SimpleRegistryBootstrap@191a01dd (org.mule.api.lifecycle.LifecycleException)

Caused by: java.lang.ClassNotFoundException: javax.servlet.http.HttpServletRequest
    at java.net.URLClassLoader$1.run(URLClassLoader.java:202)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.net.URLClassLoader.findClass(URLClassLoader.java:190)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:306)
    at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:301)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:247)
    ... 80 more
NOT FOUND

我正在对此进行故障排除时创建了一个准系统原型pom。这包括javax.servlet,所以我认为可能是它,它确实似乎解决了这个问题。

<dependency>
  <groupId>javax.servlet</groupId>
  <artifactId>servlet-api</artifactId>
  <version>${servlet-api-release-version}</version>
  <scope>provided</scope>
</dependency>

开放式问题 - 为什么会这样?

1 个答案:

答案 0 :(得分:1)

当您编译从javax.servlet包导入内容的类时,您需要在类路径上具有该依赖性。

例如,当你有public class FooServlet extends HttpServlet时,Java编译器需要能够javax.servlet.http.HttpServlet来检查父项是否final,是否要实现所有抽象方法,等


javax.servlet依赖关系需要在provided中标记为pom.xml。这是因为所有servlet容器都已包含该依赖项。如果您未能从WAR中排除此库,则Web应用程序中的HttpServlet类将与servlet容器使用的HttpServlet类不同(即FooServlet instanceof HttpServlet将为false Java不仅由它们的限定名称定义,而且还由它们的类加载器定义。)