java - 自动更新 web.xml 中的 servlet-class

标签 java eclipse servlets

我在 Eclipse 中有一个动态 Web 项目。我在项目中创建了一些新包并移动了一些 servlet。现在,servlet 无法工作,因为 web.xml 文件中的路径未更新。 它抛出以下异常

Mar 14, 2017 10:45:12 AM org.apache.catalina.core.ApplicationContext log
INFO: Marking servlet ServletName as unavailable
Mar 14, 2017 10:45:12 AM org.apache.catalina.core.StandardWrapperValve invoke
SEVERE: Allocate exception for servlet ServletName
java.lang.ClassNotFoundException: com.package.database.ServletName
    at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1676)
    at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1521)
    at org.apache.catalina.core.DefaultInstanceManager.loadClass(DefaultInstanceManager.java:415)
    at org.apache.catalina.core.DefaultInstanceManager.loadClassMaybePrivileged(DefaultInstanceManager.java:397)
    at org.apache.catalina.core.DefaultInstanceManager.newInstance(DefaultInstanceManager.java:118)
    at org.apache.catalina.core.StandardWrapper.loadServlet(StandardWrapper.java:1062)
    at org.apache.catalina.core.StandardWrapper.allocate(StandardWrapper.java:813)
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:135)
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:164)
    at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:462)
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:164)
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:100)
    at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:562)
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118)
    at com.jamonapi.http.JAMonTomcatValve.invoke(JAMonTomcatValve.java:67)
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:395)
    at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:250)
    at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:188)
    at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:302)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1110)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:603)
    at java.lang.Thread.run(Thread.java:722)

异常(exception)说明了一切, <servlet-class> servlet 的 web.xml 文件中的内容不正确。如果我更新路径,它会起作用,但我移动的 servlet 相当少。

可以自动更新整个 web.xml 文件来修复所有 <servlet-class>

最佳答案

我不认为 Eclipse 可以自动更新所有路径,但如果您使用的是 Tomcat 7.0,那么您有一个解决方法,如here所述。

Tomcat 7 是一个 Servlet 3.0 兼容容器。从 Servlet 3.0 开始,可以通过类上的 @WebServlet 注释来配置 servlet,而无需 web.xml 配置条目。仔细观察您刚刚创建的 servlet 类,它上面有一个 @WebServlet 注释,其中包含您在新建 Servlet 向导中指定的所有信息。

实际上,这种配置 servlet 的新方法

@WebServlet("/hello")
public class HelloServlet extends HttpServlet {}

与配置 servlet 的传统方式完全相同

<servlet>
    <servlet-name>helloServlet</servlet-name>
    <servlet-class>com.example.HelloServlet</servlet-class>
</servlet>
<servlet-mapping>
    <servlet-name>helloServlet</servlet-name>
    <url-pattern>/hello</url-pattern>
</servlet-mapping>

如果动态 Web 模块版本低于 3.0,则必须在项目属性的 Project Facets 部分将其更改为 3.0。

关于java - 自动更新 web.xml 中的 servlet-class,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42783994/

相关文章:

java - Play Framework 2.2.1 : Create Http. 测试上下文

java - 为什么我在 Tomcat v7.0 Server 中的发布由于另一个进程的锁定而失败?

java - 为我的 servlet 使用配置 sqlite 数据库路径的正确方法是什么?

servlets - Websphere 8.5 Liberty Profile - Servlet API setLocale

java - 直接从我的 Android 应用程序发送 Whatsapp 消息

java - 带注释的 spring 和 hibernate 示例项目

java - 如何在 Java 中从 X509Certificate 获取 CRL

java - 使用 Java 读取 PATH 变量(在 Mac OS X 上的 Eclipse 中)与 shell 不同

java - eclipse CDT : How to save project-wide environment variables programmatically (permanently)

java - 锁定上传的文件物理位置存储