참조: 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");

이렇게 짤 수도 있지만, 이렇게 하면 메이븐이 돌다가 에러 난 상황에 적절한 대처를 하기가 어렵기 때문에 위와 같이 다소 장황한 방법을 사용했습니다.