본문 바로가기
카테고리 없음

Eclipse에서 Java 프로젝트 컴파일 속도 향상하기: JarScanner 설정 이해하기

by ┌(  ̄∇ ̄)┘™ 2023. 11. 21.
728x90
728x90

프로그래밍을 하다 보면 컴파일·기동 시간이 길어져 작업 효율이 떨어지는 경우가 있습니다. 특히 의존성 JAR이 많은 큰 프로젝트에서 Eclipse + Tomcat 조합으로 개발할 때, 서버 재시작이 수십 초씩 걸리는 원인 중 하나가 JarScanner의 JAR 스캔입니다. 오늘은 scanClassPath="false" 설정으로 이 시간을 줄이는 방법과 그 원리, 그리고 더 안전한 대안까지 알아봅니다.

JarScanner의 역할

Apache Tomcat 같은 서블릿 컨테이너는 기동 시 JarScanner가 웹 애플리케이션 클래스 패스의 모든 JAR 파일을 스캔합니다. Servlet 3.0 스펙에 정의된 web-fragment.xml, 어노테이션(@WebServlet 등), META-INF/services, TLD 같은 메타데이터를 찾기 위해서인데 — JAR이 수백 개면 이 과정만으로 상당한 시간과 자원을 소모합니다.

scanClassPath="false" 설정 방법

프로젝트(또는 Tomcat)의 context.xml에 다음을 추가합니다. Eclipse에서는 Servers 뷰에 생성된 Tomcat 설정 폴더의 context.xml을 수정하면 됩니다.

<Context>
    <JarScanner scanClassPath="false" />
</Context>

효과는 다음과 같습니다.

  • 기동/컴파일 시간 감소 — 클래스 패스의 JAR을 스캔하지 않아 서버 재시작이 눈에 띄게 빨라집니다. JAR이 많을수록 체감 차이가 큽니다.
  • 자원 사용 최적화 — 불필요한 스캔이 사라져 CPU와 I/O 부담이 줄어듭니다.
  • 개발 반복 속도 향상 — 수정→재시작→확인 사이클이 짧아져 개발 리듬이 살아납니다.

주의 사항

이 설정은 양날의 검입니다. 일부 JAR은 실행에 필요한 메타데이터(서블릿 어노테이션, web-fragment, TLD)를 담고 있어서, 스캔을 끄면 특정 기능이 조용히 동작하지 않거나 런타임 에러가 날 수 있습니다. 대표적으로 JSP 태그 라이브러리(JSTL)나 어노테이션 기반 자동 등록에 의존하는 프레임워크가 영향을 받습니다. 적용 후에는 전체 기능을 한 번 돌려 보고, 문제가 생기면 아래 대안으로 전환하세요.

더 안전한 대안 — 선택적 스킵

전부 끄는 대신, 스캔할 필요가 없는 JAR만 골라 건너뛰는 방법이 있습니다. catalina.properties의 스킵 목록에 라이브러리를 추가하는 방식입니다.

# conf/catalina.properties
tomcat.util.scan.StandardJarScanFilter.jarsToSkip=\
    mysql-connector-*.jar,\
    poi-*.jar,\
    commons-*.jar

이렇게 하면 메타데이터가 필요한 JAR은 계속 스캔하면서, 확실히 필요 없는 대형 라이브러리만 제외해 속도와 안전성을 모두 챙길 수 있습니다. 기동 로그에 "TLD skipped" 관련 경고를 켜 보면(org.apache.jasper.servlet.TldScanner 로그 레벨 조정) 어떤 JAR이 스캔되고 있는지 확인하는 데 도움이 됩니다.

정리

  • 개발 장비에서 빠른 반복이 최우선이면 → scanClassPath="false"
  • 운영 환경이거나 JSP/어노테이션 의존이 있다면 → catalina.properties의 jarsToSkip 선택적 스킵
  • 적용 전후로 전체 기능 스모크 테스트는 필수
728x90

댓글