Project Classpath

2024. 10. 16. 16:25Spring 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 PathMaven 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

스프링 부트 기반 웹 애플리케이션이 실행될 때, 단일 클래스패스가 사용됩니다. 하지만 이 단일 클래스패스는 여러 경로로 구성되며, 주로 다음과 같은 구성 요소들이 포함됩니다:

클래스패스의 구성 요소

  1. 컴파일된 클래스 파일 (target/classes)
    • 애플리케이션의 소스 코드를 컴파일한 후 생성되는 .class 파일들이 위치한 경로입니다.
    • 예: target/classes (Maven 프로젝트의 경우)
  2. 리소스 디렉토리 (src/main/resources)
    • 설정 파일, 정적 파일, 템플릿 등 리소스 파일이 포함된 디렉토리입니다.
    • 예: src/main/resources (리소스 파일이 패키징되어 클래스패스에 포함됩니다.)
  3. 외부 라이브러리 (Maven Dependencies)
    • 애플리케이션이 의존하는 외부 라이브러리 JAR 파일들이 클래스패스에 포함됩니다. 이는 Maven 프로젝트에서 **pom.xml**에 선언된 의존성들을 기반으로 로컬 Maven 저장소(보통 ~/.m2/repository)에서 가져옵니다.
    • 예: ~/.m2/repository/org/springframework/boot/spring-boot-2.5.2.jar
  4. JDK와 JRE 클래스패스
    • JVM이 기본적으로 사용하는 JDK 또는 JRE의 클래스 라이브러리들이 클래스패스에 포함됩니다. 표준 자바 라이브러리(Java API)가 여기 포함됩니다.
    • 예: jrt:/java.base (Java 9 이상에서는 모듈 시스템 기반)

클래스패스의 역할

  • 단일 클래스패스는 애플리케이션 실행 시 모든 필요한 클래스 파일, 리소스 파일, 외부 라이브러리 등을 찾기 위해 사용됩니다.
  • 스프링 부트 애플리케이션이 실행될 때 JVM은 이 단일 클래스패스를 참조하여 클래스와 리소스 파일을 로드합니다.

클래스패스의 종류

  1. 컴파일 타임 클래스패스:
    • 코드를 컴파일할 때 참조되는 클래스와 라이브러리 경로입니다. Maven 프로젝트에서는 src/main/java와 target/classes 그리고 의존성 JAR 파일들이 포함됩니다.
  2. 런타임 클래스패스:
    • 애플리케이션이 실행될 때 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 파일들: 스프링 부트, 스프링 웹, 데이터베이스 드라이버 등 모든 의존성들이 클래스패스에 포함됩니다.

클래스패스 관련 도구

  1. Maven:
    • Maven은 pom.xml 파일을 통해 선언된 의존성 라이브러리를 클래스패스에 추가하고, 이를 빌드 및 실행 시 자동으로 구성합니다.
  2. 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