Classpath는 Java 가상 머신과 컴파일러가 애플리케이션을 실행할 때 클래스와 리소스를 찾는 디렉토리, JAR 및 ZIP 아카이브 목록을 정의하는 매개변수입니다.
문제의 배경:
Java가 처음 등장하면서 여러 디렉터리에 있는 많은 클래스를 로드하는 필요성이 생겼습니다. 이를 위해 의존성을 찾는 위치를 유연하게 지정할 수 있는 classpath가 만들어졌습니다.
문제:
Classpath가 잘못 설정되면 애플리케이션은 필요한 클래스를 찾지 못하고 로드 오류가 발생합니다(예: ClassNotFoundException 또는 NoClassDefFoundError).
해결책:
Classpath는 환경 변수 CLASSPATH, 명령줄 매개변수 -cp 또는 -classpath를 통해 설정할 수 있습니다. 애플리케이션 실행에 필요한 모든 디렉토리와 JAR 파일을 명시적으로 지정하는 것이 중요합니다. Classpath로 실행하는 예:
java -cp ".;lib/*" com.example.Main
주요 특징:
; (Windows) 또는 : (Linux/macOS)로 지정할 수 있습니다.lib/* — lib 폴더의 모든 JARJava는 classpath에 명시되지 않은 클래스를 스스로 찾을 수 있나요?
아니오, Java는 지정된 classpath 외부에서 자동으로 클래스를 검색하지 않습니다. 모든 경로는 명시적으로 기재되거나 빌드 또는 실행 단계에서 추가되어야 합니다.
classpath의 경로 순서가 클래스 로드에 영향을 미치나요?
네, 클래스 이름이 일치할 경우, 첫 번째 지정된 경로의 클래스가 가장 먼저 발견됩니다. 순서는 버전 충돌을 피하기 위해 중요합니다.
애플리케이션이 실행된 후 "실시간"으로 새 JAR을 classpath에 추가할 수 있나요?
아니오, 표준 classpath 메커니즘은 JVM 시작 후 정적입니다. 새로운 클래스를 동적으로 로드하려면 특수한 ClassLoader가 필요합니다.
Java 애플리케이션이 -cp lib/mylib.jar 인수로 시작되지만 테스트 구성 폴더를 추가하는 것을 잊습니다. 결과적으로 애플리케이션이 라이브러리가 있는 것처럼 보일지라도 오류로 인해 중단됩니다.
장점:
단점:
maven/gradle을 사용하여 의존성을 기반으로 자동으로 classpath를 형성합니다. 래퍼 스크립트를 통해 실행됩니다.
장점:
단점: