어제부터 신규로 웹서버를 셋팅하던 중 평소에는 만나지 못했었던 아래와 같은 오류를 만나고 말았다.
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>
오오오오~~ 잘 돌아간다~!!!
톰캣 시작시 커넥션풀 두번 실행되던 문제도 한번으로 해결됐다.
솔직히 이렇게 해도 되는진 모르겠지만... 일단 돌아는가니 이대로 진행하자........-_-;;;
만 하루 삽질끝에 그래도 성공해서 뿌듯하다. ㅠㅠ
이게 다 경험이 되겠지ㅜㅜ
그래서 포스팅 해놔야지~ 나 같은 사람 다신 없기를~