https://sundaland.tistory.com/384
[ ▶ Project Classpath ]
프로젝트의 클래스패스(Classpath)는 프로젝트가 실행될 때 JVM이 클래스, 리소스, 라이브러리를 찾기 위해 참조하는 경로이다. 클래스패스는 컴파일 시간과 실행 시간 모두에서 사용되며, 프로젝트의 빌드 시스템(Maven)과 IDE(STS4, IntelliJ) 설정에 따라 달라진다.
[ ▷ 프로젝트의 클래스패스 ]
[ ▷ 로컬 파일 시스템 ]
- 프로젝트 클래스패스는 주로 프로젝트의 특정 디렉토리와 외부 라이브러리(예: Maven 의존성 라이브러리)로 구성된다.
로컬 파일 시스템에서 클래스패스는 다음과 같은 요소들을 포함할 수 있다.
- 소스 코드 디렉토리: src/main/java는 프로젝트의 소스 파일들이 위치한 디렉토리로 클래스패스에 포함된다.
- 컴파일된 클래스 파일: 프로젝트의 컴파일된 클래스 파일들은 보통 target/classes(Maven 프로젝트) 또는 build/classes/java/main(Gradle 프로젝트) 디렉토리에 위치하며, 이 경로가 클래스패스에 포함된다.
- 외부 라이브러리: 프로젝트가 의존하는 JAR 파일들은 Maven의 경우 로컬 Maven 저장소(~/.m2/repository)에서 관리되며, 프로젝트 클래스패스에 포함된다.
[ ▷ Maven 프로젝트의 클래스패스 ]
Maven 프로젝트에서 클래스패스는 pom.xml 파일을 통해 정의된 의존성 JAR 파일들과 컴파일된 클래스 파일들이 포함된다.
- 컴파일된 클래스 파일: target/classes 디렉토리는 프로젝트가 컴파일된 후, 생성된 클래스 파일들이 위치하는 디렉토리입니다. 이는 프로젝트의 기본 클래스패스 중 하나이다.
- Maven 의존성 라이브러리: Maven이 pom.xml 파일을 참조하여 다운로드한 JAR 파일들은 로컬 Maven 저장소(~/.m2/repository)에 저장되며, 이 라이브러리들도 클래스패스에 추가된다.
Maven 빌드 시 클래스패스는 보통 다음과 같은 경로를 포함한다.
- src/main/java (소스 코드 경로)
- target/classes (컴파일된 클래스 파일 경로)
- ~/.m2/repository (Maven 의존성 JAR 파일 경로)
[ ▷ IDE에서 클래스패스 ]
STS4와 같은 IDE는 프로젝트의 빌드 설정(Maven이나 Gradle)을 참조하여 프로젝트 클래스패스를 자동으로 구성한다. IDE에서 설정된 클래스패스는 다음을 포함할 수 있다.
- 프로젝트의 소스 폴더: src/main/java와 같은 프로젝트 내의 소스 폴더들이 포함 된다.
- 컴파일된 클래스 폴더: 프로젝트가 빌드된 후 생성되는 target/classes와 같은 폴더가 클래스패스에 포함 된다.
- 외부 라이브러리 JAR 파일: Maven Dependencies 항목에서 관리되는 외부 의존성 JAR 파일들이 포함된다.
IDE에서 클래스패스를 확인하는 방법
- STS4: 프로젝트의 Java Build Path나 Maven Dependencies 항목에서 클래스패스를 확인할 수 있다. IDE는 pom.xml 파일을 바탕으로 의존성 라이브러리를 클래스패스에 자동으로 추가한다.
[ ▷ 실행 시 클래스패스 (Runtime Classpath) ]
- 애플리케이션이 실행될 때 JVM이 사용하는 클래스패스는 컴파일된 클래스 파일과 외부 라이브러리를 포함한다. Maven 프로젝트에서는 일반적으로 mvn package나 mvn install 명령어를 통해 빌드된 후, 해당 프로젝트가 target/classes 경로와 Maven Dependencies(JAR 파일들)을 클래스패스에 포함한다.
- 실행 시 클래스패스는 java -cp 명령을 통해 지정되며, target/classes 디렉토리와 외부 라이브러리 JAR 파일이 포함된다.
java -cp target/classes:~/.m2/repository/org/springframework/boot/spring-boot/
2.5.2/spring-boot-2.5.2.jar com.example.Application
[ ▷ 클래스패스를 구성하는 파일 및 경로들 ]
- 클래스 디렉토리: 프로젝트의 컴파일된 .class 파일들이 위치한 디렉토리. Maven 프로젝트에서는 주로 target/classes이다.
- 라이브러리 JAR 파일: Maven 의존성으로 추가된 외부 라이브러리 JAR 파일들. Maven 프로젝트에서는 주로 ~/.m2/repository 디렉토리에서 다운로드된 의존성들이 사용된다.
- 리소스 파일: src/main/resources 같은 디렉토리에서 설정 파일이나 기타 리소스 파일들도 클래스패스에 포함된다.
[ ▷ 클래스패스의 역할 ]
클래스패스는 JVM이 애플리케이션을 실행할 때 필요한 클래스와 리소스를 찾는 경로로 사용된다. 프로젝트에서 사용되는 소스 코드, 외부 라이브러리, 컴파일된 클래스 파일, 리소스 파일들이 이 경로에 포함된다.
[ ▷ Spring Boot Web Application Classpath ]
스프링 부트 기반 웹 애플리케이션이 실행될 때, 단일 클래스패스가 사용된다. 하지만 이 단일 클래스패스는 여러 경로로 구성되며, 주로 다음과 같은 구성 요소들이 포함된다.
△ 클래스패스의 구성 요소
- 컴파일된 클래스 파일 (target/classes): 애플리케이션의 소스 코드를 컴파일한 후 생성되는 .class 파일들이 위치한 경로이다. (target/classes (Maven 프로젝트의 경우))
- 리소스 디렉토리 (src/main/resources): 설정 파일, 정적 파일, 템플릿 등 리소스 파일이 포함된 디렉토리이다. (src/main/resources (리소스 파일이 패키징되어 클래스패스에 포함됩니다.))
- 외부 라이브러리 (Maven Dependencies): 애플리케이션이 의존하는 외부 라이브러리 JAR 파일들이 클래스패스에 포함된다. 이는 Maven 프로젝트에서 **pom.xml**에 선언된 의존성들을 기반으로 로컬 Maven 저장소(보통 ~/.m2/repository)에서 가져온다. (~/.m2/repository/org/springframework/boot/spring-boot-2.5.2.jar)
- JDK와 JRE 클래스패스: JVM이 기본적으로 사용하는 JDK 또는 JRE의 클래스 라이브러리들이 클래스패스에 포함된다. 표준 자바 라이브러리(Java API)가 여기 포함된다. (jrt:/java.base (Java 9 이상에서는 모듈 시스템 기반))
△ 클래스패스의 역할
- 단일 클래스패스는 애플리케이션 실행 시 모든 필요한 클래스 파일, 리소스 파일, 외부 라이브러리 등을 찾기 위해 사용된다.
- 스프링 부트 애플리케이션이 실행될 때 JVM은 이 단일 클래스패스를 참조하여 클래스와 리소스 파일을 로드한다.
△ 클래스패스의 종류
◎ 컴파일 타임 클래스패스
- 코드를 컴파일할 때 참조되는 클래스와 라이브러리 경로이다. Maven 프로젝트에서는 src/main/java와 target/classes 그리고 의존성 JAR 파일들이 포함된다.
◎ 런타임 클래스패스
- 애플리케이션이 실행될 때 JVM이 참조하는 클래스 경로다. 런타임 클래스패스는 컴파일된 클래스 파일, 리소스 파일, 그리고 외부 라이브러리 JAR 파일들을 포함한다.
- 런타임 클래스패스는 컴파일된 클래스와 외부 의존성 라이브러리를 함께 포함하여 애플리케이션이 실행될 수 있도록 지원한다.
[ ▷ 실행 시 클래스패스 예시 (Spring Boot) ]
▼ Maven 빌드 후 스프링 부트 애플리케이션을 실행할 때
java -cp target/classes:~/.m2/repository/org/springframework/boot/spring-boot-2.5.2.jar:
~/.m2/repository/org/springframework/boot/spring-boot-autoconfigure-2.5.2.jar
com.example.Application
- target/classes: 컴파일된 애플리케이션 클래스 파일들이 포함된다.
- ~/.m2/repository: Maven을 통해 다운로드된 외부 라이브러리(JAR 파일)들이 포함된다.
- 스프링 부트의 의존성 JAR 파일들: 스프링 부트, 스프링 웹, 데이터베이스 드라이버 등 모든 의존성들이 클래스패스에 포함된다.
[ ▷ 클래스패스 관련 도구 ]
- Maven: Maven은 pom.xml 파일을 통해 선언된 의존성 라이브러리를 클래스패스에 추가하고, 이를 빌드 및 실행 시 자동으로 구성한다.
- IDE (STS4, IntelliJ): IDE는 Maven이나 Gradle 프로젝트의 의존성을 관리하며, 컴파일 시 클래스패스와 실행 시 클래스패스를 자동으로 설정해 준다.
[ ▷ 결론 ]
- 스프링 부트 기반 웹 어플리케이션은 단일 클래스패스가 사용된다. 이 클래스패스는 컴파일된 클래스 파일, 리소스 파일, 외부 라이브러리(JAR) 등의 경로들로 구성된다.
- 스프링 부트 애플리케이션이 실행될 때, JVM은 이 단일 클래스패스를 참조하여 필요한 클래스와 리소스를 로드한다.
- 클래스패스는 컴파일 타임과 런타임 클래스패스로 나눌 수 있지만, 실제 애플리케이션 실행 시에는 통합된 클래스패스가 사용된다.
'Spring Boot > Auto-Configuration' 카테고리의 다른 글
@Import (0) | 2024.10.21 |
---|---|
@AutoConfigurationPackage (0) | 2024.10.21 |
@EnableAutoConfiguration (0) | 2024.10.21 |
Spring Boot Starter (0) | 2024.10.21 |
Spring Boot DevTools (0) | 2024.10.21 |