【问题标题】:Maven dependency javax.servlet must be included in POM for new build serverMaven 依赖 javax.servlet 必须包含在新构建服务器的 POM 中
【发布时间】:2014-04-11 11:23:03
【问题描述】:

我有一个新的 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>

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

【问题讨论】:

  • 开放端在哪里..你关闭了所有..:)

标签: java maven servlets


【解决方案1】:

当你编译从javax.servlet 包中导入某些东西的类时,你需要对你的类路径有依赖。

比如你有public class FooServlet extends HttpServlet,那么Java编译器需要能够得到javax.servlet.http.HttpServlet来检查父级是否不是final,你是否实现了所有的抽象方法等等。


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

【讨论】:

    猜你喜欢
    • 2012-05-13
    • 1970-01-01
    • 2010-11-01
    • 1970-01-01
    • 1970-01-01
    • 2022-12-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多