Maven Embedder 사용해서 자바 코드로 메이븐 Phase 또는 Goal 실행하기
참조: http://maven.apache.org/guides/mini/guide-embedding-m2.html
http://repo1.maven.org/maven2/org/apache/maven/maven-embedder/
메이븐 pom.xml에 의존성을 추가해 줍니다. 엄청 많은 transitive 의존성들이 추가되기 때문에 조금 오래 걸릴 겁니다.
<!-- maven emberdder -->
<dependency>
<groupId>org.apache.maven</groupId>
<artifactId>maven-embedder</artifactId>
<version>3.0-alpha-2</version>
</dependency>
이 녀석 하나가 끌고 오는 것만 15개입니다. 따라서 총 16개의 라이브러리를 추가한 겁니다. @_@ 사용하는 방법은 다른 것들은 다 기본 값을 사용하도록 하고, ClassLoader를 설정한 configuration을 만들어서 MavenEmbedder를 만들고, 실행할 phase나 goal들을 MavenExecutionRequest에 담고 execute를 하면 Result를 받을 수 있습니다.
Configuration configuration = new DefaultConfiguration()
.setClassLoader(Thread.currentThread().getContextClassLoader());
ConfigurationValidationResult validationResult = MavenEmbedder
.validateConfiguration(configuration);
if (validationResult.isValid()) {
MavenEmbedder embedder = new MavenEmbedder(configuration);
MavenExecutionRequest request = new DefaultMavenExecutionRequest();
request.setGoals(Arrays.asList(new String[] { "package", "cargo:start" }));
MavenExecutionResult result = embedder.execute(request);
if (result.hasExceptions()) {
...
}
} else {
...
}
이런 식이죠. 이렇게 하지 않고, 그냥 콘솔 명령어를 호출하도록
Runtime rt = Runtime.getRuntime();
Process p = rt.exec("/apps/apache-maven-2.0.10/bin/mvn.bat package");
이렇게 짤 수도 있지만, 이렇게 하면 메이븐이 돌다가 에러 난 상황에 적절한 대처를 하기가 어렵기 때문에 위와 같이 다소 장황한 방법을 사용했습니다.