我有一个新的 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
我在解决这个问题时创建了一个准系统原型(prototype) pom。这包括 javax.servlet,所以我想可能就是这样,而且它似乎确实解决了问题。
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>servlet-api</artifactId>
<version>${servlet-api-release-version}</version>
<scope>provided</scope>
</dependency>
开放式问题 - 为什么会这样?
最佳答案
当您编译从 javax.servlet
导入某些内容的类时包,您需要对类路径具有依赖关系。
例如,当您有public class FooServlet extends HttpServlet
时,那么Java编译器需要能够得到javax.servlet.http.HttpServlet
检查父级是否不是 final
,是否要实现所有抽象方法等。
javax.servlet
然后需要将依赖关系标记为 provided
在pom.xml
。这是因为所有 servlet 容器都已包含该依赖项。如果您未能从 WAR 中排除此库,HttpServlet
您的 Web 应用程序中的类将不同于 HttpServlet
servlet 容器使用的类(即 FooServlet instanceof HttpServlet
将为 false,因为 Java 中的类不仅由其限定名称定义,还由其类加载器定义)。
关于java - Maven 依赖项 javax.servlet 必须包含在新构建服务器的 POM 中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23011247/