2014-05-02 23 views
0

改變我的servlet URL在web.xml後的URL圖案[/另一/路徑]:拋出:IllegalArgumentException:命名爲[測試]和該小服務程序[pack.HelloWorld]都被映射到這是不允許

<servlet> 
    <servlet-name>test</servlet-name> 
    <servlet-class>pack.HelloWorld</servlet-class> 
    </servlet> 

    <servlet-mapping> 
    <servlet-name>test</servlet-name> 
    <url-pattern>/another/path</url-pattern> 
</servlet-mapping> 

並更改servlet本身的註釋。

@WebServlet("/another/path") 
public class HelloWorld extends HttpServlet { 
    private static final long serialVersionUID = 1L; 

我不能再啓動Eclipse中的servlet:

java.lang.IllegalArgumentException異常:名爲[測試]和[pack.HelloWorld]都映射到URL模式的servlet的[/ another/path]這是不允許的

它背後的原因是什麼?我怎樣才能解決它,而無需從servlet中刪除註釋?

堆棧跟蹤:

SEVERE: A child container failed during start 
java.util.concurrent.ExecutionException: org.apache.catalina.LifecycleException: Failed to start component [StandardEngine[Catalina].StandardHost[localhost].StandardContext[/HelloWorld2]] 
    at java.util.concurrent.FutureTask$Sync.innerGet(FutureTask.java:252) 
    at java.util.concurrent.FutureTask.get(FutureTask.java:111) 
    at org.apache.catalina.core.ContainerBase.startInternal(ContainerBase.java:1123) 
    at org.apache.catalina.core.StandardHost.startInternal(StandardHost.java:801) 
    at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150) 
    at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1559) 
    at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1549) 
    at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:334) 
    at java.util.concurrent.FutureTask.run(FutureTask.java:166) 
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1146) 
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615) 
    at java.lang.Thread.run(Thread.java:701) 
Caused by: org.apache.catalina.LifecycleException: Failed to start component [StandardEngine[Catalina].StandardHost[localhost].StandardContext[/HelloWorld2]] 
    at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:154) 
    ... 7 more 
Caused by: java.lang.IllegalArgumentException: The servlets named [test] and [pack.HelloWorld] are both mapped to the url-pattern [/another/path] which is not permitted 
    at org.apache.catalina.deploy.WebXml.addServletMapping(WebXml.java:292) 
    at org.apache.catalina.startup.ContextConfig.processAnnotationWebServlet(ContextConfig.java:2485) 
    at org.apache.catalina.startup.ContextConfig.processAnnotationsStream(ContextConfig.java:2161) 
    at org.apache.catalina.startup.ContextConfig.processAnnotationsFile(ContextConfig.java:2122) 
    at org.apache.catalina.startup.ContextConfig.processAnnotationsFile(ContextConfig.java:2115) 
    at org.apache.catalina.startup.ContextConfig.webConfig(ContextConfig.java:1295) 
    at org.apache.catalina.startup.ContextConfig.configureStart(ContextConfig.java:880) 
    at org.apache.catalina.startup.ContextConfig.lifecycleEvent(ContextConfig.java:378) 
    at org.apache.catalina.util.LifecycleSupport.fireLifecycleEvent(LifecycleSupport.java:119) 
    at org.apache.catalina.util.LifecycleBase.fireLifecycleEvent(LifecycleBase.java:90) 
    at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5343) 
    at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150) 
    ... 7 more 
May 2, 2014 7:16:26 PM org.apache.catalina.core.ContainerBase startInternal 
SEVERE: A child container failed during start 
java.util.concurrent.ExecutionException: org.apache.catalina.LifecycleException: Failed to start component [StandardEngine[Catalina].StandardHost[localhost]] 
    at java.util.concurrent.FutureTask$Sync.innerGet(FutureTask.java:252) 
    at java.util.concurrent.FutureTask.get(FutureTask.java:111) 
    at org.apache.catalina.core.ContainerBase.startInternal(ContainerBase.java:1123) 
    at org.apache.catalina.core.StandardEngine.startInternal(StandardEngine.java:302) 
    at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150) 
    at org.apache.catalina.core.StandardService.startInternal(StandardService.java:443) 
    at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150) 
    at org.apache.catalina.core.StandardServer.startInternal(StandardServer.java:732) 
    at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150) 
    at org.apache.catalina.startup.Catalina.start(Catalina.java:690) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
    at java.lang.reflect.Method.invoke(Method.java:622) 
    at org.apache.catalina.startup.Bootstrap.start(Bootstrap.java:322) 
    at org.apache.catalina.startup.Bootstrap.main(Bootstrap.java:456) 
Caused by: org.apache.catalina.LifecycleException: Failed to start component [StandardEngine[Catalina].StandardHost[localhost]] 
    at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:154) 
    at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1559) 
    at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1549) 
    at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:334) 
    at java.util.concurrent.FutureTask.run(FutureTask.java:166) 
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1146) 
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615) 
    at java.lang.Thread.run(Thread.java:701) 
Caused by: org.apache.catalina.LifecycleException: A child container failed during start 
    at org.apache.catalina.core.ContainerBase.startInternal(ContainerBase.java:1131) 
    at org.apache.catalina.core.StandardHost.startInternal(StandardHost.java:801) 
    at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150) 
    ... 7 more 
+0

請參閱此鏈接http://stackoverflow.com/questions/20246625/tomcat-failed-to-start –

+0

是否有任何堆棧跟蹤導致此錯誤消息?如果可能的話啓用調試日誌以獲取儘可能多的信息。 – prabugp

+0

stacktrace added – user3163473

回答

1

嘗試刪除或者

<servlet-mapping> 
    <servlet-name>test</servlet-name> 
    <url-pattern>/another/path</url-pattern> 
</servlet-mapping> 

@WebServlet("/another/path") 

你不應該混合映射的servlet將URL的不同方式。

我還建議檢查pack.HelloWorldHelloWorld extends HttpServlet類是否真的是一樣的。

+0

好吧,這可能是一個解決方法,但我意識到一件事,如果映射引用註釋和web.xml中的不同的URL,它的工作原理!你知道爲什麼它無法啓動,如果URL是相同的? – user3163473

+0

@ user3163473由於某些原因我不清楚,'test'和'pack.HelloWorld'認爲**不是**是同一個servlet。這就是爲什麼tomcat啓動時要麼刪除其中一個映射,要麼使它們不同。 –

相關問題