eclipse에서 WTP와 같은 플러그인을 사용하지 않고 embedded WAS를 직접 사용하는 경우가 있다. tomcat 버전 또한 embedded 버전이 나와 eclipse에서 직접 실행하도록 설정했다.
https://devcenter.heroku.com/articles/create-a-java-web-application-using-embedded-tomcat 문서를 참고해 정말 쉽게 embedded tomcat을 사용하도록 설정했다. 그런데 다음과 같은 에러가 발생.
10월 22, 2013 11:46:56 오전 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[Tomcat].StandardHost[localhost].StandardContext[/]]
at java.util.concurrent.FutureTask$Sync.innerGet(Unknown Source)
at java.util.concurrent.FutureTask.get(Unknown Source)
at org.apache.catalina.core.ContainerBase.startInternal(ContainerBase.java:1123)
at org.apache.catalina.core.StandardHost.startInternal(StandardHost.java:800)
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(Unknown Source)
at java.util.concurrent.FutureTask.run(Unknown Source)
at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
at java.lang.Thread.run(Unknown Source)
Caused by: org.apache.catalina.LifecycleException: Failed to start component [StandardEngine[Tomcat].StandardHost[localhost].StandardContext[/]]
at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:154)
... 7 more
Caused by: java.lang.NoSuchMethodError: javax.servlet.ServletContext.getSessionCookieConfig()Ljavax/servlet/SessionCookieConfig;
at org.apache.catalina.deploy.WebXml.configureContext(WebXml.java:1311)
at org.apache.catalina.startup.ContextConfig.webConfig(ContextConfig.java:1352)
at org.apache.catalina.startup.ContextConfig.configureStart(ContextConfig.java:878)
at org.apache.catalina.startup.ContextConfig.lifecycleEvent(ContextConfig.java:369)
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:5173)
at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150)
... 7 more
원인은 tomcat 버전이 servlet 2.5을 사용하지 않고 servlet 3.0을 사용하면서 발생하는 이슈였다. 즉, 프로젝트에 의존관계를 맺고 있는 servlet 2.5 버전을 다음과 같이 3.x 버전으로 업그레이드하면 해결할 수 있다.
JDK 7.0 이상을 사용하는 경우
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>3.1.0</version>
<scope>provided</scope>
</dependency>
JDK 6.0 이상을 사용하는 경우
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>3.0.1</version>
<scope>provided</scope>
</dependency>
위와 같이 해결했더니 정말 깔끔하게 해결되었다. IDE에 embedded tomcat 연동하는 작업은 정말 간단하군. 앞으로 WTP는 버리고 embedded tomcat 사용하련다.
4개의 의견 from SLiPP
최신버전으로 설치해보세요 저는 최신버전으로 햇더니 문제없이 톰캣 기동 되었네요
@nicolas 이 이슈는 tomcat 버전에 따른 servlet 버전 때문에 발생하는 이슈였어요. 공유한 라이브러리는 mysql jdbc driver라 이 이슈와 관련 없을 것 같아요. 감사합니다.
같은 오류로 구글링하며 돌고돌아 여기까지 왔습니다. servlet버전 때문이란 것을 여러곳에서 확인했는데요. 정확하게 어떤 버전이 맞아야 하는건가요? 말씀하신대로 pom.xml에서 javax.servlet-api의 버전수정을 했는데도... 같은오류가 발생합니다. 참고로 저의 환경은 비교적 최신버전들을 사용하는데요.
자바 1.8(jdk 1.8.0_181 톰캣 8.0(80.053) 전자정부프레임워크3.6 사용합니다.
아파치 폴더에 있는 servlet-api.jar파일을 jdk폴더에 복사하라는 것도 있었는데... 그것도 복사해두니 안되구요... 이것 때문에 1주일을 시간허비를 하고 있는데 미치겠네요 ㅠ.ㅜ
혹시 내용 좀 더 정확하게 설명가능하시면 답글 부탁드리겠습니다. 감사합니다.
@Tay Kim 웹 프로젝트 속성 -> Project Facets-> Dynamic Web Module 속성이 3.0으로 돼있나요?
의견을 남기기 위해서는 SLiPP 계정이 필요합니다.
안심하세요! 회원가입/로그인 후에도 작성하시던 내용은 안전하게 보존됩니다.
SLiPP 계정으로 로그인하세요.
또는, SNS 계정으로 로그인하세요.