我有一个新的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>
开放式问题 - 为什么会这样?
答案 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不仅由它们的限定名称定义,而且还由它们的类加载器定义。)