메이븐 프로젝트 빌드시 parent, common child 빌드 순서를 정리

Maven 멀티 모듈 프로젝트에서 빌드 순서는 Maven Reactor에 의해 자동으로 계산되지만, 기본적으로 의존성(Dependency)과 상속(Inheritance) 관계에 따라 결정됩니다.

정리하자면 빌드 순서는 Parent(Root) → Common(의존되는 모듈) → Child(의존하는 모듈) 순서입니다.

상세한 순서와 이유는 다음과 같습니다.


1. 빌드 순서 요약

  1. Parent (Root Project)

    • 가장 먼저 처리됩니다.

    • 프로젝트의 전체 구조, 공통 설정(플러그인 버전, 자바 버전 등)을 읽어들여야 하므로 최우선순위입니다.

  2. Common (Shared Library)

    • 다른 자식 모듈들이 가져다 쓰는(Dependency) 모듈입니다.

    • 다른 모듈이 컴파일되기 전에 먼저 컴파일되고 패키징되어야 합니다.

  3. Child (Service / Web / API)

    • Parent를 상속받고, Common을 의존성으로 가지는 실제 비즈니스 모듈들입니다.

    • 가장 마지막에 빌드됩니다.


2. 예시 구조 및 상세 설명

다음과 같은 프로젝트 구조가 있다고 가정해 보겠습니다.

  • my-project (Parent/Root)

    • my-common (Child 1: 공통 유틸리티)

    • my-api (Child 2: my-common을 사용함)

1단계: Parent (Root)

  • 역할: 모든 모듈의 부모입니다. <packaging>pom</packaging>으로 설정되어 있습니다.

  • 이유: 자식 모듈들이 Parent의 pom.xml 설정을 상속받기 때문에, Maven은 Parent를 먼저 읽어서 빌드 환경을 구성해야 합니다.

2단계: Common (의존성 제공자)

  • 설정: my-api가 my-common을 의존성(dependencies)으로 가지고 있습니다.

  • 이유: my-api를 컴파일하려면 my-common의 클래스 파일(Jar)이 필요합니다. 따라서 Maven Reactor는 의존성 그래프를 분석하여 my-api보다 my-common을 먼저 빌드 목록에 올립니다.

3단계: Child (의존성 사용자)

  • 설정: my-common을 의존성으로 포함합니다.

  • 이유: 모든 준비물(Parent 설정, Common 라이브러리)이 갖춰진 상태에서 마지막으로 빌드됩니다.


3. 실제 pom.xml 설정 예시

Maven이 이 순서를 이해하게 하려면 pom.xml에 명시적인 관계 설정이 필요합니다.

Root (my-project/pom.xml)

Xml

<project>
    <groupId>com.example</groupId>
    <artifactId>my-project</artifactId>
    <version>1.0.0</version>
    <packaging>pom</packaging> <!-- 중요 -->
    
    <modules>
        <module>my-common</module>
        <module>my-api</module>
    </modules>
</project>

Common (my-project/my-common/pom.xml)

Xml

<project>
    <parent>
        <groupId>com.example</groupId>
        <artifactId>my-project</artifactId>
        <version>1.0.0</version>
    </parent>
    <artifactId>my-common</artifactId>
    <!-- 의존성 없음 (혹은 외부 라이브러리만 의존) -->
</project>

Child (my-project/my-api/pom.xml)

Xml

<project>
    <parent>
        <groupId>com.example</groupId>
        <artifactId>my-project</artifactId>
        <version>1.0.0</version>
    </parent>
    <artifactId>my-api</artifactId>
    
    <dependencies>
        <!-- 여기서 common을 의존한다고 명시해야 순서가 잡힘 -->
        <dependency>
            <groupId>com.example</groupId>
            <artifactId>my-common</artifactId>
            <version>1.0.0</version>
        </dependency>
    </dependencies>
</project>

4. 빌드 실행 및 결과

메이븐 프로젝트 빌드시 parent, common child 빌드 순서를 정리한다

루트 경로에서 아래 명령어를 실행하면:

Bash

mvn clean install

Maven Reactor는 다음과 같은 순서로 로그를 출력하며 빌드합니다.

Text

[INFO] Reactor Build Order:
[INFO] 
[INFO] my-project ........................................ [pom]  (1. Parent)
[INFO] my-common ......................................... [jar]  (2. Common)
[INFO] my-api ............................................ [jar]  (3. Child)

주의사항:
만약 <modules> 태그 안에 my-api가 my-common보다 먼저 적혀 있더라도, my-api의 pom.xml에 my-common에 대한 <dependency>가 선언되어 있다면, Maven은 자동으로 my-common을 먼저 빌드합니다. (알파벳 순서나 모듈 나열 순서보다 의존성 관계가 우선합니다.)