빌드노트
Maven에서 다른 profile을 켜면 기본 설정이 빠지는 이유
-Paudit를 켰을 때 기본 속성이 빠진다면 활성 profile과 최종 POM부터 확인한다. 같은 POM의 activeByDefault 동작을 세 조건으로 비교하고, 공통 설정을 본체로 옮길지 두 profile을 명시할지 판단한다.
Maven을 옵션 없이 실행할 때 있던 속성이 -Paudit를 붙이면 없어질 수 있다. 그 속성이 activeByDefault profile 안에 있다면, 같은 POM의 다른 profile이 활성화되면서 기본 profile이 빠졌는지 먼저 확인한다. audit이 같은 속성을 덮어쓰지 않아도 이 현상은 생긴다.
activeByDefault는 모든 실행에 공통 설정을 붙이는 장치가 아니다. Maven profile 문서 (새 탭에서 열림)는 같은 POM의 다른 profile이 명시적으로 또는 활성화 조건으로 켜지면 기본 활성 profile이 비활성화된다고 설명한다. 항상 필요한 설정이라면 POM 본체로 옮기는 편이 맞고, 특정 조합에서만 필요하다면 두 profile을 함께 명시할 수 있다.
실패한 빌드와 같은 조건으로 조회한다
JDK와 Maven이 설치되고 mvn.cmd를 실행할 수 있는 Windows PowerShell 기준이다. 문제가 난 프로젝트의 pom.xml이 있는 폴더에서 빌드의 생명주기 목표 대신 다음 조회 목표를 실행한다. audit은 켰던 profile ID로, lab.required는 사라진 속성명으로 바꾼다.
세 명령 모두 실제 빌드의 POM·settings·-P·-D 인자와 JDK를 유지한다. 아래는 별도 인자 없이 -Paudit만 붙이던 경우다. 원래 -f, -s, -gs나 모듈 선택 인자를 썼다면 각 조회에도 그대로 붙인다. 옵션의 뜻은 Maven CLI 문서 (새 탭에서 열림)에서 확인할 수 있다. 진단하려고 빈 settings로 바꾸면 원래의 활성 목록과 달라질 수 있다. 최초 실행에는 플러그인과 의존성을 받을 수 있어야 한다.
mvn.cmd org.apache.maven.plugins:maven-help-plugin:3.5.2:active-profiles '-Paudit'
mvn.cmd org.apache.maven.plugins:maven-help-plugin:3.5.2:evaluate '-Paudit' '-Dexpression=lab.required' '-q' '-DforceStdout'
mvn.cmd org.apache.maven.plugins:maven-help-plugin:3.5.2:effective-pom '-Paudit' '-Doutput=effective-audit.xml'
하나씩 실행하며 다운로드나 POM 해석 오류가 나면 그 오류부터 해결한다. 출력 파일 이름은 기존 파일과 겹치지 않게 정한다. active-profiles (새 탭에서 열림)는 현재 활성 profile을 보여 주고, evaluate (새 탭에서 열림)의 forceStdout은 -q에서도 요청한 평가 결과를 출력하게 한다.
같은 속성을 덮어쓰지 않아도 빠졌다
별도 최소 프로젝트에서 위 명령을 확인했다. Windows 11, Maven 3.9.16, JDK 17.0.2와 Help Plugin 3.5.2를 사용했다. POM 본체에는 lab.common=BASE, 기본 profile에는 lab.required=FROM_DEFAULT, audit profile에는 lab.audit=AUDIT만 두었다. 서로 다른 속성명이므로 audit이 required를 덮어쓰는 구성은 아니다.
기본 profile의 ID는 default로 정했다. 그 이름 자체에 특별한 기능이 있는 것은 아니며, 해당 profile에 다음 활성화 설정을 두었다.
<activation>
<activeByDefault>true</activeByDefault>
</activation>
-Paudit를 붙인 첫 명령의 활성 목록에는 다음 한 줄만 있었다. 프로젝트 좌표는 합성 예제의 값이다.
- audit (source: example:profile-lab:1.0)
두 번째 명령의 출력은 null object or invalid expression이었다. 이 예제에서는 lab.required를 평가할 값이 없다는 결과다. 이 명령도 종료 코드는 0이었으므로 종료 코드만 보고 속성이 존재한다고 판단할 수 없다. 자기 프로젝트에서는 속성명 오타도 같은 출력을 낼 수 있으므로 선언한 이름까지 확인한다.
세 번째 명령이 만든 effective-audit.xml의 project 바로 아래 properties에는 다음 두 값만 있었다.
<properties>
<lab.audit>AUDIT</lab.audit>
<lab.common>BASE</lab.common>
</properties>
effective-pom (새 탭에서 열림)은 활성 profile 등을 반영한 최종 POM을 보여 준다. 이번 출력에는 비활성인 기본 profile의 정의도 아래쪽 profiles에 남아 있었다. 파일 전체에서 lab.required라는 문자열을 찾는 것만으로는 적용 여부를 알 수 없다. 이 예제에서는 project/properties에 들어갔는지를 읽어야 한다.
같은 세 명령에서 '-Paudit' 인자를 모두 빼거나 '-Pdefault,audit'로 바꿔 비교했다. effective POM을 저장할 파일 이름도 각각 다르게 지정했다. 다음은 직접 관찰한 결과다.
- 옵션 없음:
default만 활성화됐다. 평가 값은FROM_DEFAULT였고, 최상위 속성에는lab.common과lab.required가 있었다. -Paudit:audit만 활성화됐다. 평가 결과는null object or invalid expression이었고, 최상위 속성에는lab.common과lab.audit만 있었다.-Pdefault,audit:default와audit이 함께 활성화됐다. 평가 값은FROM_DEFAULT였고, 최상위 속성 세 개가 모두 있었다.
audit에는 lab.required를 덮어쓰는 선언이 없다. 따라서 이번 누락은 속성 충돌의 결과가 아니라, 그 속성을 공급하던 profile이 활성 목록에서 빠진 결과다. 반대로 자기 프로젝트에서 기본 profile도 활성화되어 있는데 값만 다르다면, 이 실험과 같은 원인으로 단정하지 말고 동일한 속성을 정하는 다른 선언과 실행 인자를 확인한다.
공통 설정인지 선택 설정인지에 따라 고친다
lab.required가 audit 실행에도 늘 필요하다면 기본 profile 안의 해당 속성을 제거하고 POM 본체의 기존 properties에 합친다.
<properties>
<lab.common>BASE</lab.common>
<lab.required>FROM_DEFAULT</lab.required>
</properties>
이렇게 바꾼 별도 POM에도 같은 -Paudit 검사를 실행했다. 활성 profile은 여전히 audit 하나였지만, 평가 값은 FROM_DEFAULT로 돌아왔고 최상위 속성 세 개가 모두 남았다. 기본 profile을 되살리지 않아도 공통 값이 공급된 것이다. 본체로 옮긴 값도 다른 곳에서 같은 이름으로 재정의할 수 있으므로 최종 값 확인은 필요하다.
반면 기본 profile의 설정이 특정 조합에서만 필요하다면 원래 POM을 유지하고 '-Pdefault,audit'를 사용한다. 이 경우 default는 자동 기본 활성화에 기대는 대신 ID로 명시적으로 선택된다. 위 비교처럼 두 profile이 함께 활성화되는지와 필요한 값이 남는지를 확인한다. CI도 같은 조합을 명시해야 한다.
이번 비교는 하나의 POM 안에 있는 두 profile과 Help Plugin의 모델 조회까지다. 부모·자식 POM, 다른 모듈이나 settings에 정의된 profile까지 모두 꺼진다는 결론으로 넓히지 않는다. 실제 배포 플러그인 실행과 Maven 4의 동작은 검증하지 않았다.