Project Classpath
2024. 10. 16. 16:25ㆍSpring Boot/Spring Boot Auto Configuration
프로젝트의 클래스패스(Classpath)는 프로젝트가 실행될 때 JVM이 클래스, 리소스, 라이브러리를 찾기 위해 참조하는 경로입니다. 클래스패스는 컴파일 시간과 실행 시간 모두에서 사용되며, 프로젝트의 빌드 시스템(예: Maven)과 IDE(예: STS4, IntelliJ) 설정에 따라 달라집니다.
프로젝트의 클래스패스
1. 로컬 파일 시스템
- 프로젝트 클래스패스는 주로 프로젝트의 특정 디렉토리와 외부 라이브러리(예: Maven 의존성 라이브러리)로 구성됩니다.
- 로컬 파일 시스템에서 클래스패스는 다음과 같은 요소들을 포함할 수 있습니다:
- 소스 코드 디렉토리: 예를 들어, src/main/java는 프로젝트의 소스 파일들이 위치한 디렉토리로 클래스패스에 포함됩니다.
- 컴파일된 클래스 파일: 프로젝트의 컴파일된 클래스 파일들은 보통 target/classes(Maven 프로젝트) 또는 build/classes/java/main(Gradle 프로젝트) 디렉토리에 위치하며, 이 경로가 클래스패스에 포함됩니다.
- 외부 라이브러리: 프로젝트가 의존하는 JAR 파일들은 Maven의 경우 로컬 Maven 저장소(~/.m2/repository)에서 관리되며, 프로젝트 클래스패스에 포함됩니다.
2. 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 파일 경로)
3. 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 파일을 바탕으로 의존성 라이브러리를 클래스패스에 자동으로 추가합니다.
4. 실행 시 클래스패스 (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 > Spring Boot Auto Configuration' 카테고리의 다른 글
spring-boot-autoconfigure.jar (0) | 2024.10.16 |
---|---|
spring.factories (0) | 2024.10.16 |
@AutoConfigurationPackage (0) | 2024.10.16 |
@EnableAutoConfiguration (0) | 2024.10.16 |
@SpringBootConfiguration (0) | 2024.10.16 |