2016년 5월 29일 일요일

tomcat error

어제부터 신규로 웹서버를 셋팅하던 중 평소에는 만나지 못했었던 아래와 같은 오류를 만나고 말았다.


 


in the generated java file Only a type can be imported. 패키지명.클래스명 resolves to a package


 


클래스파일에서 특정 클래스를 임포트를 할때는 문제가 없는데,


JSP 에서 직접 임포트를 하면 이런 에러가 난다.


 


근데 특이한건 java 기본 클래스들은 정상적으로 임포트가 된다.(예: java.util.List)


또한 웹루트 바로 아래에 있는 JSP에서는 정상동작하는게, 한단계 폴더 아래로만 들어가면 똑같이 에러가 난다.


예)


도메인/test.jsp   => 정상


도메인/a/test.jsp  => 에러


 


참 별일이다.


분명 로컬에서 이클립스에서 돌릴때는 잘 돌았는데, 서버에 올리니깐 이런 에러가 떨어지니깐 정말 돌아버리는줄 알았다.


 


근데 스프링 컨트롤러 타는건 잘 돌아간다.


jsp에서 직접적으로 해당 클래스를 호출하는건 왜 해당 패키지 경로를 못 찾겠다는 에러를 뱉는걸까...??


로컬에서 작업하던거 그대로 복사해서 올렸는데.....해당 경로에 클래스도 다 있는데...왜 이러지??


 


정작 만 하루를 삽질한 결과 해결했다!!!!!!


 


 


원인은 톰캣의 server.xml 에 있었다.


웹서버(centos 64bit)의 톰캣 버전은 6.0.29


 


난 사실 평소에 아래처럼 설정했었다.


(<host 밑에 context 를 넣고 했다. 어차피 한 서버에 한개만 돌릴꺼니깐)


 


웹루트가 /home/abcd/web 라는 가정일때


예)


<Host name="localhost"  appBase="/home/abcd/web"
            unpackWARs="true" autoDeploy="true"
            xmlValidation="false" xmlNamespaceAware="false">
          <Context path="" docBase="/home/abcd/web" debug="0" reloadable="true"></Context>


 


혹은


<Host name="localhost" appBase="/home/abcd/web"
     unpackWARs="true" autoDeploy="true"
     xmlValidation="false" xmlNamespaceAware="false">
     <Context path="" docBase="." debug="0" reloadable="true"></Context>


 


 


 


이런식으로 했었는데......


위와 같은 에러가 났던것이다.


 


원인은 해당 경로를 내가 원하는대로 못 찾는것


즉 설정 방법이 잘못되었던것.


(근데 로컬에서는 저렇게 해도 잘 돌더만 -_-+ 예전 서버도 저렇게 쓰고 있었는데...)


 


뭐 아무튼 context 설정 하는 방법은 여러가지가 있지만 난 이렇게 바꿔봤다.


 


<Host name="localhost" appBase="/home/abcd"
unpackWARs="true" autoDeploy="true"
xmlValidation="false" xmlNamespaceAware="false">
<Context path="" docBase="web" debug="0" reloadable="true"></Context>


 


사실 appBase 란 웹루트이며, docBase 는 appBase 바로 밑에 해당 폴더(프로젝트)명이다.


이게 기본 원칙이다.


그래서 여러개의 프로젝트를 돌릴때는 아래와 같이 한단다.


 


<Host name="localhost" appBase="/home/abcd"
unpackWARs="true" autoDeploy="true"
xmlValidation="false" xmlNamespaceAware="false">
<Context path="" docBase="web1" debug="0" reloadable="true"></Context>


<Context path="web2" docBase="web2" debug="0" reloadable="true"></Context>


 


그래서 위와 같이 설정 했을때 해당 URL을 호출할때는


도메인/~ 하면 web1 프로젝트로,


도메인/web2/~ 하면 web2 프로젝트로 호출된다고 한다.


 


 


그럼 나는 아래와 같이 하면 되겠네???


 


<Host name="localhost" appBase="/home/abcd"
unpackWARs="true" autoDeploy="true"
xmlValidation="false" xmlNamespaceAware="false">
<Context path="" docBase="web" debug="0" reloadable="true"></Context>


 


와~ 진짜 된다!!!!!!!!!!!!대박


근데 잘 돌아는가는데 한가지 문제가 생겼다.


톰캣 START시 실행되는 커넥션풀 생성이 두번 이루어 지는것이었다.


 


으잉???


 


왜 두번이나 돌까??


난 정말 이유는 잘 모르겠다.


(아마도 appBase를 한번 탐색하고, context 를 한번 탐색하는건 아닐런지 조심히 추측해본다...-_-;; 절대 아니겠지만..)


 


 


그래서 한번 아래처럼 바꿔봤다.


(appBase 를 빼버리고, docBase 에 풀 경로 셋팅)


 


<Host name="localhost"  
                unpackWARs="true" autoDeploy="true"
xmlValidation="false" xmlNamespaceAware="false">
   <Context path="" docBase="/home/abcd/web" debug="0" reloadable="true"></Context>


 


 


 


오오오오~~ 잘 돌아간다~!!!


톰캣 시작시 커넥션풀 두번 실행되던 문제도 한번으로 해결됐다.


 


솔직히 이렇게 해도 되는진 모르겠지만... 일단 돌아는가니 이대로 진행하자........-_-;;;


 


만 하루 삽질끝에 그래도 성공해서 뿌듯하다. ㅠㅠ


이게 다 경험이 되겠지ㅜㅜ


 


그래서 포스팅 해놔야지~ 나 같은 사람 다신 없기를~

댓글 없음:

댓글 쓰기