maven archetype 버전 함정: 생성기가 만들어준 기본값은 내 환경 기준이 아니었다
maven-archetype-webapp이 만든 pom.xml 컴파일 버전 1.7, web.xml 2.3 때문에 안 돈다. javax와 jakarta 차이(톰캣 9 vs 10), 버전이 세 군데 흩어져 있는 문제까지.
목차
서블릿 게시판의 첫 단계. 브라우저에서 주소를 치면 내가 만든 자바 클래스가 응답하는 것까지다. 코드는 몇 줄 안 되는데 띄우기까지가 하루였다.
톰캣 버전 하나 때문에 예제가 다 안 돌았다
깔려 있던 톰캣이 11이었고, 자료는 전부 9 기준이었다.
톰캣 10부터 서블릿 패키지 이름이 바뀌었다.
javax.servlet // 톰캣 9까지
jakarta.servlet // 톰캣 10부터
오라클이 자바 EE를 재단에 넘기면서 javax라는 이름을 못 쓰게 돼서 생긴 변경이다. 기능은 똑같고 이름만 다르다.
근데 JSP/Servlet 자료가 거의 다 javax 기준이라 예제를 그대로 옮기면 안 돈다. 톰캣 9를 따로 깔았다.
만들어준 프로젝트 뼈대가 2001년이었다
Maven의 maven-archetype-webapp으로 프로젝트를 만들었다. 만들어준 거니까 맞겠지 하고 그대로 썼다.
| 파일 | 기본값 | 문제 |
|---|---|---|
pom.xml | 컴파일 버전 1.7 | JDK 21은 1.7을 아예 못 받는다 |
web.xml | 서블릿 2.3 규격 | 2001년 규격. 쓰려는 건 4.0 |
여기서 알게 된 게, 버전이 세 군데에 따로 적혀 있다는 거였다.
- JDK 버전 (내 컴퓨터에 깔린 것)
pom.xml의 컴파일 버전web.xml의 규격 버전
이게 서로 안 맞아도 각자는 조용하다. 파일을 열어봐도 아무 표시가 없다. 실행할 때가 되어서야 터진다.
복사한 XML에 닫는 태그가 안 따라왔다
라이브러리를 추가하려고 사이트에서 XML을 복사해 붙였는데 이런 에러가 났다.
Duplicated tag: 'groupId' @ line 16
</dependency> 닫는 태그가 안 따라와서 <dependency> 하나 안에 라이브러리 세 개가 다 들어가 있었다. groupId가 세 번 나오니 Maven이 어느 라이브러리 정보인지 몰라서 못 읽은 거다.
그리고 같은 실수를 web.xml에서도 했다. 새로 여는 태그를 넣고 원래 있던 걸 안 지워서 여는 태그 2개, 닫는 태그 1개가 됐다.
헤더는 블로그 말고 톰캣한테 물어봤다
web.xml 맨 위 헤더를 정확히 뭘 써야 하는지 몰랐다. 블로그마다 조금씩 달랐다.
그러다 톰캣이 자기 설정 파일을 갖고 있다는 걸 알았다.
/opt/homebrew/opt/tomcat@9/libexec/conf/web.xml
여기 18~22줄에 정확한 4.0 헤더가 있었다. 톰캣이 자기가 쓰는 걸 적어놓은 거니까 블로그보다 확실한 출처다.
에디터가 이상한 데서 돌고 있었다
자바랑 상관없는데 하루를 잡아먹은 것 중 하나라 적어둔다.
VS Code가 /Applications에 없는데 실행은 되고 있었다. 프로세스 경로를 보니 이랬다.
/private/var/folders/.../AppTranslocation/B4D4AFF4-.../Visual Studio Code.app
macOS가 격리 속성이 붙은 앱을 임의의 임시 경로로 옮겨서 실행하는 기능이다(App Translocation). 그래서 code 명령도 안 잡히고 자동 업데이트도 안 됐다. 버전이 한참 전에 멈춰 있었다.
터미널에서 mv로 /Applications에 옮겼는데도 계속 임시 경로로 떴다. mv는 격리 속성을 안 지운다. Finder로 옮기면 지워진다.
남길 것
- 생성기가 준 기본값은 내 환경 기준이 아니다. 만들어준 파일도 버전부터 확인한다.
- 버전이 여러 군데 흩어져 있고, 안 맞아도 조용하다. 실행할 때 터진다.
- XML을 복사할 때 닫는 태그까지 왔는지 본다. 같은 실수를 두 파일에서 반복했다.
- 도구가 쓰는 설정 파일이 가장 정확한 예제다. 톰캣의
conf/web.xml처럼. - 뼈대만 만들어도 바로 커밋한다. 커밋 안 한 건 없는 것과 같다.
- macOS 앱은 압축 풀고 바로 실행하지 말고
/Applications로 옮긴다. 옮길 때는 Finder로.
더 봐야 할 것
javax자료가 정말 더 많은 게 맞는지. 서블릿 클래스 쓰면서 확인해볼 참- 톰캣이 두 개(9, 11) 깔려 있는데 나중에 헷갈리는 일이 생길지