如果 WEB-INF/classes 目录存在,Tomcat 服务器将不会启动

Posted

技术标签:

【中文标题】如果 WEB-INF/classes 目录存在,Tomcat 服务器将不会启动【英文标题】:Tomcat server won't start if WEB-INF/classes directory exists 【发布时间】:2017-04-18 05:18:00 【问题描述】:

我目前正在为学校开发一个动态 Web 项目,但遇到了一个奇怪的问题……我正在尝试从 .jsp 文件运行 servlet。我做了很多研究,显然(如果我错了,请纠正我!)如果你想在 .jsp 文件中使用它们,你需要将编译的 servlet 或 java 类文件放入 WEB-INF/classes 目录中。

在将构建路径设置为此目录甚至创建目录之前,我能够运行我的网络应用程序。第二次我对构建路径进行了更改,我的服务器拒绝启动,我现在收到此错误:

    SEVERE: A child container failed during start
    java.util.concurrent.ExecutionException: org.apache.catalina.LifecycleException: Failed to start component [StandardEngine[Catalina].StandardHost[localhost].StandardContext[/PullUp]]
at java.util.concurrent.FutureTask.report(FutureTask.java:122)
at java.util.concurrent.FutureTask.get(FutureTask.java:192)
at org.apache.catalina.core.ContainerBase.startInternal(ContainerBase.java:915)
at org.apache.catalina.core.StandardHost.startInternal(StandardHost.java:871)
at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:145)
at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1407)
at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1397)
at java.util.concurrent.FutureTask.run(FutureTask.java:266)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
at java.lang.Thread.run(Thread.java:745)
    Caused by: org.apache.catalina.LifecycleException: Failed to start component [StandardEngine[Catalina].StandardHost[localhost].StandardContext[/PullUp]]
at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:162)
... 6 more
    Caused by: java.lang.IllegalArgumentException: The servlets named [ListingServlet] and [com.pullup.ListingServlet] are both mapped to the url-pattern [/ListingServlet] which is not permitted
at org.apache.tomcat.util.descriptor.web.WebXml.addServletMappingDecoded(WebXml.java:316)
at org.apache.tomcat.util.descriptor.web.WebXml.addServletMapping(WebXml.java:309)
at org.apache.catalina.startup.ContextConfig.processAnnotationWebServlet(ContextConfig.java:2384)
at org.apache.catalina.startup.ContextConfig.processAnnotationsStream(ContextConfig.java:2066)
at org.apache.catalina.startup.ContextConfig.processAnnotationsWebResource(ContextConfig.java:1951)
at org.apache.catalina.startup.ContextConfig.processAnnotationsWebResource(ContextConfig.java:1945)
at org.apache.catalina.startup.ContextConfig.processAnnotationsWebResource(ContextConfig.java:1945)
at org.apache.catalina.startup.ContextConfig.webConfig(ContextConfig.java:1156)
at org.apache.catalina.startup.ContextConfig.configureStart(ContextConfig.java:783)
at org.apache.catalina.startup.ContextConfig.lifecycleEvent(ContextConfig.java:307)
at org.apache.catalina.util.LifecycleSupport.fireLifecycleEvent(LifecycleSupport.java:95)
at org.apache.catalina.util.LifecycleBase.fireLifecycleEvent(LifecycleBase.java:90)
at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5213)
at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:145)
... 6 more

有人对如何解决这个问题有任何想法吗?任何帮助将不胜感激!

【问题讨论】:

您是否有一个 web.xml 文件定义了一个名为 ListingServlet 的 servlet 以及一个名为 com.pullup.ListingServlet 的类并带有 @WebServlet 注释? 两者都同意。 注解是web.xml 的替代品。您对它进行了双重定义,这就是错误告诉您的内容。不要两者都做。 【参考方案1】:

您得到都映射到 url-pattern 异常,因为当 Tomcat 尝试加载 servlet 类时,它为同一个 servlet 找到了 2 个映射,即一个来自 web.xml,另一个来自@webservlet

@webservlet 是另一种方式(在 JavaEE6 容器中)定义 servlet url 映射(内联到 servlet 源代码)。因此,您不应该将这些 servlet 和映射添加到 web.xml 中(即,只需从 WEB-INF 文件夹中删除 web.xml)。

【讨论】:

谢谢!!在这个问题上卡了很长时间,但这个小调整解决了它!再次感谢您:)

以上是关于如果 WEB-INF/classes 目录存在,Tomcat 服务器将不会启动的主要内容,如果未能解决你的问题,请参考以下文章

Eclipse下无法编译,或者WEB-INF/classes目录下没文件,编译失败的解决办法

Eclipse下无法自动编译,或者WEB-INF/classes目录下没文件,编译失败的解决办法(转载)

classpath的总结

spring配置中的classpath

Proguard 仅在我的战争中混淆 /WEB-INF/classes/**/*.class 文件

src/main/resources 下的文件位于 target/WEB-INF/classes 下