Computing/Programming2009/06/11 13:31
오늘 만난 에러이다.

스트러츠 1.3.10을 사용한 웹 애플리케이션을 개발하던 도중 만났다.;

전체 메시지는 다음과 같다.

HTTP Status 404 - Servlet action is not available

type Status report
message Servlet action is not available
description The requested resource (Servlet action is not available) is not available.

Apache Tomcat/5.5.27

고맙게도 에러 메시지는 저게 다다.;;;;

자... 뭐가 문젤까? 이런 경우 가장 크게 의심이 가는 건, 역시 설정 파일이다. web.xml 파일과 struts-config.xml 파일을 이잡듯 뒤졌지만, 뚜렷한 원인을 찾지 못했다.

구글링을 해보니, 역시나 그런 쪽 문제이다. 톰캣이 스트러츠의 액션 서블릿을 초기화하다 무슨 문제가 생긴 것이다. 그런데 로그도 찾을 수 없고, 에러 메시지는 저게 달랑 다라서 좀 헤맸다.;

결론적으로는 struts-config.xml 파일의 문제였다. <controller> 앨리먼트와 <message-resources> 앨리먼트의 속성으로 아직 만들지 않은 자바 클래스를 지정해 뒀던 것이다. 이것이 문제가 되어 스트러츠 액션 서블릿이 제대로 로드가 되지 않았던 것 같다.

결국, servlet-config.xml 파일의 어떤 부분에서라도 잘못이 있으면 스트러츠를 사용할 수 없다. 부분적(?)으로도 기동하지 않는다는 것이다.

이번 일로, 역시 에러 메시지의 중요성에 대해 깨달았다.; 그냥 저렇게만 떡하니 나오니 이거 서울에서 김서방 찾기지..;;;

그리고 나서 웹 애플리케이션을 다시 구동해 보니 이제 저 에러는 사라졌다. 단지 그 다음 에러가 났을 뿐이다.;;

그래도 이번엔 예외 스택에 쌓인 에러 메시지가 주~~욱 나와 주신다. 이런 고마울 데가!! ^^;;;

** 추가 **

개발 서버에서 배포 서버로 웹 애플리케이션을 WAR 형태로 배포한 뒤에 배포 서버에서 또 위와 같은 에러가 나왔다.;;

문제의 소지가 역시 struts-config.xml에 있을 것이라고 판단하였지만, 개발 서버에서는 동일한 내용을 가지고 잘 실행이 되는 것이, 배포 서버에서만 안된다는 것이 이상했다.

...........약 12시간 동안 별의 별 삽질을 다 하였지만 결국 해결을 못했다. 톰캣 설정과 로그도 다 뒤져가면서..; 대체 어디가 문제란 말인가....

좌절의 늪에서 기어 나와 다시 삽을 들고 struts-config.xml을 파기 시작했다. 이번에 취한 approach는 struts-config.xml 내의 앨리먼트를 하나씩 주석 처리해 가며 결과를 보는 것이었다.

이럴 수가, <form-beans> 앨리먼트가 문제였다. 대체 나의 폼빈들이 무엇이 문제가 있단 말인지... 그 순하디 순한 아이들이...

<form-beans> 앨리먼트를 주석 처리하고 웹 애플리케이션을 돌려보니 일단 된다. 하다보니 예외가 발생하였는데 그 예외인 즉,

java.lang.UnsupportedClassVersionError: Bad version number in .class file

였다...

아뿔싸!!

그제서야 주마등처럼 머리를 스치고 지나가는 생각. 개발 서버에서의 자바 버전은 6이고, 배포 서버에서의 자바 버전은 5였던 것이다!!! >_<;;

사소한 차이라고 여겨졌던 그 차이는, 결국 개발 서버에서 자바 6로 컴파일된 나의 폼빈 클래스들이 배포 서버의 자바 5 런타임에서 구동되지 못하도록 했고, 폼빈이 제대로 구동되지 않자 스트러츠의 ActionServlet 요놈이 체대로 초기화 되지 못했던 것이다...

모든 수수께끼는 풀렸어!

라고 말하는 김전일이 생각난다.;;;

그의 명대사 하나가 더 생각이 나는군..

어쨌거나 범인은 이 안에 있다..

어쨌거나 범인(원인)은 이 안(struts-config.xml 안)에 있다............-_-;;;

감히 확신하건대, 스트러츠 사용 시 'Servlet action is not available'이라는 에러가 나는 것은 거의 이 struts-config.xml 이 놈 때문이고, 이 놈을 잘 살펴보다보면 사건(?)의 실마리를 잡을 수 있다.

안의 설정들을 주석 처리해가며, 수사망(?)을 좁혀가는 것이다. 수사망을 좁히다보면 용의선 상에 오르는 놈이 있다. 이 놈을 족쳐야 한다...;

아무튼 12시간의 사투 끝에, 놈을 검거했고 이제는 저 골치아픈 메시지를 보지 않게 됐다.

그러나 모른다. 언제 어디서 놈이 우릴 노릴지...

그래서 우리는 항상 그를 경계하여야 할 것이다....

- THE END -

ps. 흠? 글이 어쩌다가 이렇게 됐지? -_-;;;;


Posted by pcandme

TRACKBACK http://pcandme.net/trackback/68 관련글 쓰기

댓글을 달아 주세요

  1. 저도 설정땜에 몇십분 헤매다가 님의 글 보고 struts-config.xml 파일에서 문제를 찾았네요

    감사합니다^^~

    2011/07/04 09:39 [ ADDR : EDIT/ DEL : REPLY ]

Computing/Programming2009/04/11 16:16
이클립스 웹 프로젝트에서 만난 오늘의 에러~

CHKJ3000E: WAR Validation Failed: java.lang.NullPointerException

반갑게 인사(...)하고 에러 코드인 'CHKJ3000E'로 구글링한 결과... web.xml 파일의 문제일 가능성이 있단다! 때마침 web.xml 파일 수정 후 튀어나온 에러~

웹 애플리케이션 레벨의 오류 처리 페이지 설정을 위하여, <error-page> 엘리먼트를 XML 디자인 에디터로 추가하였는데, 이것이 문제일 것으로 짐작하고 코드 에디터로 전환하여 보니 <error-page> 엘리먼트의 속성 엘리먼트인 <exception-type> 엘리먼트와 <location> 사이에 빈 줄이 하나 삽입되어 있는 것을 발견, 설마하고 빈 줄을 삭제해 보니 에러가 사라진다..

뭐야... 얘... 디자인 에디터... 그저 편해서 썼더니 이런 짓(?)을...!

이라지만 앞으로도 애용할 생각! :)

아무튼 오늘도 오류 한 건(?) 해결~

다음의 페이지들을 참고하였다!!

- http://www.eclipsezone.com/eclipse/forums/t64709.html
- http://erik.weibust.net/2006/06/22/eclipse-what-the-heck-is-chkj3000e
Posted by pcandme

TRACKBACK http://pcandme.net/trackback/59 관련글 쓰기

댓글을 달아 주세요

Computing/Programming2009/04/11 13:23
JSP를 공부하던 중, 웹 애플리케이션의 web.xml 파일 내 필터 매핑 엘리먼트의 속성 중 하나인 <url-pattern> 엘리먼트 설정을 책의 내용대로 'some_path/*.jsp'처럼 해서 특정 디렉터리('some_path')에 있는 JSP 파일에만 필터를 적용되도록 했더니 톰캣이 뜨면서 오류가 발생한다. 이클립스 콘솔에 출력된 에러 메시지를 보니 'invalid <url-pattern>'이란다.

구글을 찾아보니, Servlet specification 2.4에서 JSP 속성 그룹(jsp-propertity-group)에 허용되는 URL 패턴은 다음과 같단다.

- A string beginning with a / character and ending with a /* suffix is used for path mapping.
- A string beginning with a *. prefix is used as an extension mapping.
- A string containing only the / character indicates the "default" servlet of the application. In this case the servlet path is the request URI minus the context path and the path info is null.
- All other strings are used for exact matches only.

즉, 위와 같이 하려면 '/some_path/*'라고 해야한다.

구글에서 찾은 페이지에 따르면, 톰캣의 이전 버전에서는 'some_path/*.jsp' 같은 것이 가능했다고 한다. 그러나 이것은 Servlet specification을 따르는 것이 아니므로, 수정되었다고 한다.

* 참고 문헌
- http://objectmix.com/java/159394-tomcat-5-0-web-xml-filter-mapping-url-pattern-content-jsp.html
- http://www.mail-archive.com/tomcat-dev@jakarta.apache.org/msg43676.html
- http://www.coderanch.com/t/84442/Tomcat/write-correct-url-pattern-security
Posted by pcandme

TRACKBACK http://pcandme.net/trackback/58 관련글 쓰기

댓글을 달아 주세요