DEV Community

dss99911
dss99911

Posted on • Originally published at dss99911.github.io

Maven 핵심 가이드 - 빌드 라이프사이클과 의존성 관리

Maven은 프로젝트 관리 도구로, POM(Project Object Model) 개념을 기반으로 합니다.

1. 기본 용어

용어 설명
goal 빌드와 프로젝트 관리에 기여하는 특정 태스크
site 리포팅 관련 기능
POM Project Object Model - 프로젝트 설정 파일

2. 디렉토리 구조

${basedir}: 프로젝트 폴더

항목 기본 경로
Source code ${basedir}/src/main/java
Resources ${basedir}/src/main/resources
Tests ${basedir}/src/test
Distributable JAR ${basedir}/target
Compiled byte code ${basedir}/target/classes

3. Repository

Repository 순서

  1. Local repository 확인
  2. 없으면 Maven Central Repository에서 다운로드

Local Repository

경로: ~/.m2

Maven Central Repository

4. 빌드 라이프사이클

주요 Phase

Phase 설명
prepare-resources 리소스 복사 커스터마이징
compile 소스 코드 컴파일
package pom.xml의 packaging에 따라 JAR/WAR 생성
install 로컬/원격 maven repository에 패키지 설치

상세 라이프사이클

Phase 설명
validate 프로젝트 정확성 및 필요 정보 확인
initialize 빌드 상태 초기화 (속성 설정)
generate-sources 컴파일에 포함할 소스 코드 생성
process-sources 소스 코드 처리 (값 필터링 등)
generate-resources 패키지에 포함할 리소스 생성
process-resources 리소스를 대상 디렉토리로 복사 및 처리
compile 프로젝트 소스 코드 컴파일
process-classes 컴파일된 파일 후처리 (바이트코드 최적화 등)
generate-test-sources 컴파일에 포함할 테스트 소스 생성
process-test-sources 테스트 소스 코드 처리
test-compile 테스트 소스 코드를 테스트 대상 디렉토리로 컴파일
process-test-classes 테스트 코드 컴파일 파일 후처리
test 단위 테스트 프레임워크로 테스트 실행 (JUnit 등)
prepare-package 패키징 전 필요한 작업 수행
package 컴파일된 코드를 배포 가능한 형식으로 패키징
pre-integration-test 통합 테스트 전 필요한 작업 (환경 설정 등)
integration-test 통합 테스트 환경에 패키지 배포 및 실행
post-integration-test 통합 테스트 후 작업 (환경 정리 등)
verify 패키지 유효성 및 품질 기준 확인
install 로컬 repository에 패키지 설치
deploy 원격 repository에 최종 패키지 복사

5. 의존성 Scope

주요 Scope 설명

compile (기본값)

  • build, test, run 타이밍에 사용됨
  • 해당 의존성을 참조하는 프로젝트에서 접근 가능
  • Gradle의 api configuration과 유사
  • 참조하지 않는다면 runtime으로 설정하는 것이 빌드 시간 단축에 유리

runtime

  • test, run 타이밍에 사용됨
  • 참조하는 프로젝트에서는 접근 불가
  • runtime에서는 class 파일 사용 가능
  • Gradle의 implementation과 유사

provided

  • build, test 타이밍에 사용
  • 참조하는 프로젝트에서 접근 가능
  • runtime에서는 class 파일이 빠져있음
  • 인터페이스처럼 사용 - 빌드 시에는 인터페이스로 참조, 런타임에는 원하는 구현체 사용

test

  • 테스트 코드 컴파일 및 실행에만 사용

Scope 사용 예시

<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-core</artifactId>
    <version>5.3.0</version>
    <scope>compile</scope>
</dependency>

<dependency>
    <groupId>javax.servlet</groupId>
    <artifactId>servlet-api</artifactId>
    <version>2.5</version>
    <scope>provided</scope>
</dependency>
Enter fullscreen mode Exit fullscreen mode

참고: Maven Dependency Scopes

6. 로컬 라이브러리 추가

프로젝트 내 라이브러리 폴더 사용:

<dependency>
    <groupId>com.example</groupId>
    <artifactId>my-library</artifactId>
    <version>1.0.0</version>
</dependency>

<repositories>
    <repository>
        <id>in-project</id>
        <name>custom jars</name>
        <url>file://${project.basedir}/lib</url>
    </repository>
</repositories>
Enter fullscreen mode Exit fullscreen mode

디렉토리 구조

lib/
  com/
    example/
      my-library/
        1.0.0/
          my-library-1.0.0.jar
          my-library-1.0.0.pom
Enter fullscreen mode Exit fullscreen mode

업데이트 방법

  1. Maven project sync
  2. Maven indices 업데이트
  3. 변경 시 버전 증가 필요

7. 캐시 관리

"cannot resolve {package}" 에러 해결

mvn dependency:purge-local-repository
Enter fullscreen mode Exit fullscreen mode

이 명령어는 로컬 repository에서 손상된 의존성을 제거하고 다시 다운로드합니다.

기타 캐시 정리 옵션

# 로컬 repository의 특정 의존성 삭제
rm -rf ~/.m2/repository/com/example/

# 전체 캐시 삭제 (주의!)
rm -rf ~/.m2/repository/
Enter fullscreen mode Exit fullscreen mode

8. 유용한 명령어

# 프로젝트 빌드
mvn clean install

# 테스트 스킵
mvn clean install -DskipTests

# 특정 프로파일로 빌드
mvn clean install -P production

# 의존성 트리 확인
mvn dependency:tree

# 효과적인 POM 확인
mvn help:effective-pom
Enter fullscreen mode Exit fullscreen mode

참고 자료


Originally published at https://dss99911.github.io

Top comments (0)