Maven 멀티 모듈 프로젝트에서 빌드 순서는 Maven Reactor에 의해 자동으로 계산되지만, 기본적으로 의존성(Dependency)과 상속(Inheritance) 관계에 따라 결정됩니다.
정리하자면 빌드 순서는 Parent(Root) → Common(의존되는 모듈) → Child(의존하는 모듈) 순서입니다.
상세한 순서와 이유는 다음과 같습니다.
1. 빌드 순서 요약
-
Parent (Root Project)
-
가장 먼저 처리됩니다.
-
프로젝트의 전체 구조, 공통 설정(플러그인 버전, 자바 버전 등)을 읽어들여야 하므로 최우선순위입니다.
-
-
Common (Shared Library)
-
다른 자식 모듈들이 가져다 쓰는(Dependency) 모듈입니다.
-
다른 모듈이 컴파일되기 전에 먼저 컴파일되고 패키징되어야 합니다.
-
-
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)
<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)
<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)
<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. 빌드 실행 및 결과

루트 경로에서 아래 명령어를 실행하면:
mvn clean install
Maven Reactor는 다음과 같은 순서로 로그를 출력하며 빌드합니다.
[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을 먼저 빌드합니다. (알파벳 순서나 모듈 나열 순서보다 의존성 관계가 우선합니다.)