提供了一套用java方法调用来实现maven的命令执行接口,方便你通过java代码来实现项目打包发布等操作。特别是用在自动化倒闭的需求中。可以考虑使用。
1.MavenInvoker的maven依赖
<dependency><groupId>org.apache.maven.shared</groupId><artifactId>maven-invoker</artifactId><version>2.2</version></dependency>
2.使用用法
import java.io.File;import java.util.Collections;import org.apache.maven.shared.invoker.DefaultInvocationRequest;import org.apache.maven.shared.invoker.DefaultInvoker;import org.apache.maven.shared.invoker.InvocationRequest;import org.apache.maven.shared.invoker.Invoker;import org.apache.maven.shared.invoker.MavenInvocationException;/*** @author: fanjinlong* @date: 2018/12/18 19:51* @description:*/public class Application {public static void main(String[] args) {InvocationRequest request = new DefaultInvocationRequest();request.setPomFile(new File("/Users/neters/Users/neters/yidian/it-inte/pom.xml"));request.setGoals(Collections.singletonList("package"));Invoker invoker = new DefaultInvoker();try {invoker.execute(request);} catch (MavenInvocationException e) {e.printStackTrace();}}}
jar包已经打好:

- 利用退出码判断构建结果。退出码为“0”表示构建成功,退出码为“1”则表示构建失败
InvocationRequest request = new DefaultInvocationRequest();request.setPomFile(new File("/Users/neters/Users/neters/yidian/it-inte/pom.xml"));request.setGoals(Collections.singletonList("package"));Invoker invoker = new ();try {InvocationResult result = invoker.execute(request);int exitCode = result.getExitCode();System.out.println("退出码:"+exitCode);if (0==exitCode){System.out.println("构建成功");}else{System.out.println("构建失败");}} catch (MavenInvocationException e) {e.printStackTrace();}
3.Invoker单实例配置复用
用户可以通过Invoker配置为Maven API调用指定全局选项,配置单个Invoker实例并在多个方法调用从而实现复用。
import java.io.File;import java.util.Arrays;import java.util.List;import org.apache.maven.shared.invoker.DefaultInvocationRequest;import org.apache.maven.shared.invoker.DefaultInvoker;import org.apache.maven.shared.invoker.InvocationRequest;import org.apache.maven.shared.invoker.InvocationResult;import org.apache.maven.shared.invoker.Invoker;import org.apache.maven.shared.invoker.MavenInvocationException;/*** @author: fanjinlong* @date: 2018/12/18 20:44* @description:*/public class MavenInvokerBuilder{private static final List<String> GOALS = Arrays.asList("clean", "package", "-DskipTests");/*** 定义Invoker实例.**/private final Invoker invoker;/*** 在构造器中实例化Invoker**/public MavenInvokerBuilder(File localRepositoryDir) {this.invoker = new DefaultInvoker();this.invoker.setLocalRepositoryDirectory(localRepositoryDir);}/*** 此方法将被重复调用,并启动新的生成。。。*/public void build() throws MavenInvocationException {InvocationRequest request = new DefaultInvocationRequest();request.setBatchMode(false);request.setGoals(GOALS);InvocationResult result = invoker.execute(request);if (result.getExitCode() != 0) {if (result.getExecutionException() != null) {throw new MavenInvocationException("验证pom.xml错误!",result.getExecutionException());}}}}
测试:
import java.nio.file.Paths;import org.apache.maven.shared.invoker.MavenInvocationException;import org.junit.Test;/*** @author: fanjinlong* @date: 2018/12/18 20:45* @description:*/public class MavenInvokerBuilderTest {@Testpublic void build() throws MavenInvocationException {= new (Paths.get(".").toFile());.build();}}

4.结合InvocationOutputHandler捕获构建输出
可以利用InvocationOutputHandler进行捕获。InvocationOutputHandler可以通过invoker或者request进行设置。
import java.io.File;import java.util.Arrays;import java.util.List;import org.apache.maven.shared.invoker.DefaultInvocationRequest;import org.apache.maven.shared.invoker.DefaultInvoker;import org.apache.maven.shared.invoker.InvocationOutputHandler;import org.apache.maven.shared.invoker.InvocationRequest;import org.apache.maven.shared.invoker.InvocationResult;import org.apache.maven.shared.invoker.Invoker;import org.apache.maven.shared.invoker.MavenInvocationException;/*** @author: fanjinlong* @date: 2018/12/18 20:44* @description:*/public class {private static final List<String> PUBLISH_GOALS = Arrays.asList("clean", "package","-DskipTests");private StringBuilder output = new StringBuilder();;/*** 为调用程序实例定义一个字段。**/private final Invoker invoker;/*** 在类构造函数中实例化调用程序**/public (File localRepositoryDir) {this.invoker = new ();this.invoker.setLocalRepositoryDirectory(localRepositoryDir);}/*** 此方法将被重复调用,并启动新的生成*/public void build() throws MavenInvocationException {InvocationRequest request = new DefaultInvocationRequest();request.setBatchMode(false);request.setGoals(PUBLISH_GOALS);setOutput(request);InvocationResult result = this.invoker.execute(request);if (result.getExitCode() != 0) {if (result.getExecutionException() != null) {throw new MavenInvocationException("Verify the pom.xml error!",result.getExecutionException());}}}/*** 通过调用请求设置输出处理程序。* @param request InvocationRequest*/private void setOutput(InvocationRequest request) {request.setOutputHandler(new InvocationOutputHandler() {@Overridepublic void consumeLine(String line) {output.append(line).append(System.lineSeparator());}});}/*** 通过调用程序设置输出处理程序。**/private void setOutput(Invoker invoker) {invoker.setOutputHandler(new InvocationOutputHandler() {@Overridepublic void consumeLine(String line) {output.append(line).append(System.lineSeparator());}});}public String getOutput() {return output.toString();}}
测试
import org.apache.maven.shared.invoker.MavenInvocationException;import org.junit.Test;/*** @author: fanjinlong* @date: 2018/12/18 20:45* @description:*/public class MavenInvokerBuilderTest {@Testpublic void build() throws MavenInvocationException {= new (Paths.get(".").toFile());.build();String output = .getOutput().toString();System.out.println("---------------------------------");System.out.println("---------------------------------");System.out.println("---------out----------put--------");System.out.println("---------------------------------");System.out.println("---------------------------------");System.out.println(output);}}

注意事项
- 用户可以使用Invoker.setMavenHome()方法来指定Maven可执行文件位置。 如果用户没有设置该值,则Invoker将使用系统属性maven.home或环境变量M2_HOME的值作为其默认值。
- 如果在Maven Surefire插件运行的单元测试中进行了API调用,则需要Surefire将系统属性maven.home传递给测试用例:
<project>...<build><plugins><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-surefire-plugin</artifactId><version>2.12.4</version> <!-- see surefire-page for available versions --><configuration><systemPropertyVariables>${maven.home}</maven.home></systemPropertyVariables></configuration></plugin></plugins>...</build>...</project>
