클래스패스(classpath)

자바가 클래스를 사용하려고 탐색을 할 때 JVM 혹은 자바 컴파일러가 사용하는 파라미터로
클래스나 패키지를 찾을 때 기준이 되는 경로를 말한다.

 

소스 코드(.java)를 컴파일하면 바이트코드(.class)로 변환되고 JVM이 바이트코드로 된 파일을 실행하려면 찾아야 하는데 이 바이트코드까지의 경로를 클래스패스라고 한다.

클래스패스를 설정하는 방법

-classpath(-cp) 옵션

javac <options> <source files>

컴파일러가 컴파일 하기 위해서 필요로 하는 참조할 클래스 파일들을 찾기 위해서 컴파일시 파일 경로를 지정해주는
옵션이다.

 

만약 BestStar.java 파일이 C:\Java 디렉터리에 존재하고 필요한 클래스 파일들이 C:\Java\BestStarClass에 위치한다면

javac -classpath C:\Java\BestStarClass C:\Java\BestStar.java

로 해주면 된다.

 

만약 참조할 클래스 파일들이 다른 디렉터리에도 존재한다면

javac -classpath .;C:\Java\BestStarClass;C:\Java\ABCDEFG;C:\Java\BestStar.java

과 같이 세미콜론(;) 으로 구분해줄 수 있다.

참고로 도트(.)는 현재 디렉토리를 의미한다.

 

이러한 -classpath 옵션을 사용하지 않을 경우 클래스 파일이 위치한 현재 디렉토리를 기본 클래스패스로 잡아준다.

 

💡 참고로 -classpath 옵션은 java(런타임)와 javac(컴파일타임) 명령어에 모두 사용할 수 있다.

처음에 런타임에도 -classpath 옵션을 사용할 수 있다기에 개인적으로 이해가 안 갔는데

생각해보면 클래스를 컴파일하면 소스 코드(.java) 파일이 바이트코드(.class) 파일로 변환되고,

런타임 때 이 바이트코드 파일에 포함된 명령을 실행하기 위해서는 이 파일을 탐색할 경로를 알아야 하기 때문에 사용할 수 있는 것이다.

 

CLASSPATH 환경변수

환경변수는 운영체제에서 자식 프로세스들을 생성할 때 참조하는 변수로
프로세스가 컴퓨터에서 동작하는 방식에 영향을 미치는 동적인 값들을 모아둔 것이다.

JVM 기반의 애플리케이션도 이 환경변수 값을 참고해서 동작하게 된다.

 

이 값을 지정하면 실행할 때마다 -classpath(-cp) 옵션을 사용하지 않아도 된다.

그러나 운영체제를 변경하면 클래스패스가 유지되지 않고 사라지기 때문에 이식성 측면에서 좋지 않다.

Windows 환경변수 설정 화면

💡 컴파일된 바이트코드를 클래스로더가 클래스 로딩 단계에서 CLASSPATH 라는 환경변수에 있는 경로들을 참조하여 로딩을 한다. 자세한 내용이 궁금하다면 클래스 로더를 정리해뒀으니 참고 바란다. 

 

 

IDE의 자동 클래스패스 설정

최근에는 위에서 언급한 이식성 측면 때문에 운영체제 상의 환경변수로 클래스패스를 설정하는 것은 지양하고 IDE나 빌드 도구를 통해 클래스패스를 설정한다.

IntelliJ의 경우 Project Structure - Project Settings - Modules 메뉴에서 Add Content Root로 소스코드, 테스트 소스코드, 리소스, 외부 폴더 등의 클래스패스를 확인하고 설정할 수 있다.

💡 각 용도별 클래스패스 폴더가 궁금하다면 JetBrains 에서 제공하는 폴더 카테고리 글을,
위 그림에는 나와있지 않지만 테스트용 리소스 클래스패스 경로를 생성하고 설정하고 싶다면 JetBrains 에서 제공하는 테스트용 리소스 Root 글을 참고하기 바란다.

 


출처

클래스패스

docs.oracle.com/javase/tutorial/essential/environment/paths.html

velog.io/@ljs0429777/7주차-과제-패키지#classpath-

 

IDE의 자동 클래스패스 설정

https://gintrie.tistory.com/67