我有一个新的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>
开放式问题-为什么会这样?
最佳答案
在编译从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中的类不仅由它们的限定名称,也可以通过其类加载器)。