嗨..我已经在Tomacat5.x中部署了my.war,因为我使用的是java1.5。当时CentOS中的JAVA_HOME=java5path和CATALINA_HOME=tomcat5.x路径。效果很好。
现在我的问题是,
我在 Tomcat7.x 中使用 JAVA_HOME=java1.7 和 CATALINE_HOME=tomcat7.x 部署相同的 war ,但出现以下错误
java.lang.ClassNotFoundException: org.apache.catalina.servlets.InvokerServlet
at java.net.URLClassLoader$1.run(URLClassLoader.java:366)
at java.net.URLClassLoader$1.run(URLClassLoader.java:355)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(URLClassLoader.java:354)
at java.lang.ClassLoader.loadClass(ClassLoader.java:424)...
我也在java1.7中编译了代码并部署在Tomcat7中..同样的错误。有人可以建议我如何克服这个问题吗?
谢谢。
最佳答案
从Tomcat 7开始支持新的Servlet标准版本3.0,我们必须注册里面使用的所有Servlet类。出于安全目的,这是严格的。
Tomcat 6 及以下版本,web.xml
<servlet>
<servlet-name>invoker</servlet-name>
<servlet-class>
org.apache.catalina.servlets.InvokerServlet
</servlet-class>
<init-param>
<param-name>debug</param-name>
<param-value>0</param-value>
</init-param>
<load-on-startup>2</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>invoker</servlet-name>
<url-pattern>/servlet/*</url-pattern>
</servlet-mapping>
Tomcat 7 及以上版本
<listener>
<listener-class>
com.test.MyServletContextListener
</listener-class>
</listener>
<context-param>
<param-name>com.package</param-name>
<param-value>
com.test.servlet,
com.example.application,
</param-value>
<description>servlet implemented packages</description>
</context-param>
在 MyServletContextListener.java 中扩展 ServletContextListener
并获取所有类并使用(覆盖)contextInitialized 方法进行注册,如下面的示例片段所示。
for (Class clazz : classes) {
String mapping = prefix + clazz.getName();
ServletRegistration sr = sc.addServlet(clazz.getName(), clazz.getName());
sr.addMapping(mapping);
}
关于Tomcat7 中的 Java 1.5 war 产生 InvokerServlet 异常?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18591632/