메이븐 빌드, 그래들 빌드... 한번 하고나면 사실 잘 볼일이 없는데, 그래서 그런지 뭔가 할 일이 있을때마다 매번 까먹는다. 종종 이런걸 모르면 개발자가 맞나? 생각도 들고... 그래서 깊게는 못보더라도 간단하게나마 계속 알아가면 좋을 것 같아 포스팅을 한다.
포스팅을 하게 된 이유 : 프로젝트를 메이븐이 제공하는 기능으로 빌드하는데, 왜 리소스가 생길때까 있고 안 생길때가 있지?
메이븐이란??
Maven은 크게 라이브러리 jar파일 저장소 기능, 라이브러리간 의존성 관리, 애플리케이션 빌드관리 기능을 제공한다.
여기서 대부분 라이브러리간 의존성 관리는 쓸것이다. 프로젝트 초기에 라이브러리들을 다운받아야 하니까! 내가 모르는 부분은 바로 애플리케이션 빌드부분에 관한 것이었다.
Plugin, Goal, Phase, Lifecycle
Maven에서 제공하는 모든 기능들은 플러그인 단위로 제공된다.플러그인들 별로 복수의 goal이라는 것을 제공하는데, 이 goal들은 Maven에서 실행되는 가장 기본적인 작업 실행단위가 된다.
이러한 goal들 중 필수적이고 기본이 되는 goal들은 phase라는 것에 바인딩된다. phase도 goal과 마찬가지로 작업을 실행할 수 있는 단위인데, maven의 goal을 좀더 사용하기 편하게 추상화한 작업단계라 생각하면 된다.각 phase에 사전 바인딩된 goal들은 pom.xml파일 설정을 통해 바꿀수도 있고, phase에 goal 바인딩을 추가할 수 도 있다.
phase는 순서로 종속성이 구성되어서, 만약 "test" phase 실행을 명령하면, 종속성이 맺어진 순으로 process-resources → compile → process-test-resources → test-compile → test 순서로 총 5개의 phase를 수행한다.
이러한 phase들은 모여서 lifecycle을 구성한다.
lifecycle은 default(빌드,배포와 관련된 phase의 모음), clean(리소스 삭제, 초기화 관련된 phase의 모음), site(사이트배포관련된 phase의 모음)로 구성되며, phase간 선후행관계는 lifecylce 안 에서만 유효하다.
메이븐을 이루고있는 구성요소들에 대한 전반적인 설명이다. 기본적으로 goal이라는 최소작업단위가 있으며, 이를 좀더 사용자들이 사용하기 쉽게 phase에 각 goal을 바인딩 시킨다. (일종의 한 트랜잭션 안에서 여러 쿼리문들이 아토믹하게 작동하는 느낌이랑 비슷한 것 같다.)
실행
pom.xml이 위치한 디렉토리에서 "mvn <phase명>" 또는 "mvn <플러그인명>:<goal명>" 등으로 실행한다.
"mvn <phase명> <플러그인명>:<goal명> <phase명>" 처럼 phase명과 plugin goal명을 섞어서 사용도 가능하다.
phase명으로 실행시키는 경우, 선행 phase가 자동으로 먼저 실행된 다음 해당 phase가 실행된다는 것을 명심하도록 한다.
특정 phase에 바인딩되지 않은 plugin의 goal들은 직접 명령행에서 <플러그인명>:<goal명>으로 실행하거나,
다음 장에서 설명할 pom 파일 구성을 통해 plugin의 goal을 먼저 phase에 바인딩한다음 phase 호출을 통해서 실행시킬 수 도 있다.
각각 명령 수행 사례는 다음과 같다. (package가 jar로 설정되어 있음을 전제)
- mvn compiler:compile
의존성 phase인 "process-resouces" phase 실행 없이 달랑 compile phase만 수행한다.
- mvn test
test phse의 의존 phase순서대로 process-resouces → compile → process-test-resources → test-compile → test phase를 수행한다.
- mvn compile surefire
test → process-resource → complie → test phase를 수행한다
바로 이부분이다. IntelliJ IDE가 지원해주는 기능으로 LifeCycle의 compile을 돌렸을때오, plugin 기능으로 돌렸을때 왜 리로스가 추가가 되고 안되는지.... 위에 써있듯이, phase명으로 실행시 의존된 선행 phase를 먼저 실행한다. 그래서 complie시 선행 phase인 process-resource가 실행되었던 것이다!
그러나, plugin의 complie은 위의 설명처럼 mvn compiler:compile 표기되어 있다... 그래서 컴파일만 달랑 했던것이다... 어쩐지.... 이것때문에 계속 프로퍼티 파일 못찾겠다고 빌드조차 안되던걸 많이 봤었는데... 후.... 이제 알았으니 다행이다.
그 외 잡다한 설정들은 그때그때 알아가면 좋을 것 같다. 우선 이제 pom.xml 파일을 읽을 수 있다는 사실이 큰것 같다.
우연히 발견한 태그인데... autoddl을 mvc환경에서 해보려 했던 나에게 딱 알맞춤 아닌가?..... 대박 ㅋㅋ 나중에 더 봐야지
sql | Executes SQL scripts from files or inline. |
ref
https://maven.apache.org/plugins/#available-plugins