Java使用maven-invoker插件进行maven相关操作
官方文档地址:https://maven.apache.org/shared/maven-invoker/index.html
Apache Maven Invoker
在许多情况下,工具(包括Maven本身)可能希望在干净的环境中启动Maven构建。为什么呢?也许您希望避免Maven插件产生的副作用污染当前系统环境。也许您想从与当前${user.dir}不同的工作目录运行构建。也许您希望保留这样的功能:如果某个Maven构建由于某种原因挂起,可以立即终止它。
这个API与在新的JVM中触发Maven构建有关。它通过从当前请求中给出的选项以及调用程序本身中指定的全局选项构建常规Maven命令行来完成任务。一旦有了命令行,调用程序将执行它,并捕获结果退出代码或抛出的任何异常,以表示执行失败。输入/输出控制可以使用一个InputStream和最多两个InvocationOutputHandler来指定。
Features
跟踪由调用引起的退出代码和异常,
全局选项:
Maven- home Location (Maven应用程序目录的位置)
本地存储库位置
API日志设置
Maven可执行
请求选项:
全局校验和策略(失败/警告,跨定义存储库的全局校验和策略)
本地存储库位置
POM文件
文件名称(与基本目录一起使用)
交互/批处理模式(确定Maven是否提示输入)
离线模式
Update-Snapshots标志
调试标志(显示调试级输出)
安静标志(只显示错误)
显示错误标志(显示异常堆栈跟踪,但不显示完整的调试输出)
No-Transfer-Progress标志(下载或上传时不显示传输进度)
继承- shell - environment标志(从用于启动当前JVM的shell继承envars)
反应堆故障行为(最终故障,从不故障等)
输入/输出处理程序
构建属性(-D开关)
建立目标
设置位置(Settings .xml文件路径)
线程计数(自Maven3与-T)
工具链位置(从带有-t的Maven3开始)
命令行开始或结束处的附加原始cli选项
Usage
本页记录了Maven调用API的基本用法。
使用调用API的最简单方法是同时构造调用程序和请求,并简单地调用invoker.execute(request)。在这个例子中,我们不关心构建结果:
InvocationRequest request = new DefaultInvocationRequest(); request.setPomFile( new File( "/path/to/pom.xml" ) ); request.setGoals( Collections.singletonList( "install" ) ); Invoker invoker = new DefaultInvoker(); invoker.execute( request );
这段代码将在/path/to/pom.xml中定义的项目的install生命周期阶段执行一个新的Maven构建。如果构建失败了,我们将幸福地保持无知……
Checking the Exit Code(检查退出代码)
如果我们想在上面的例子中检测构建失败,我们可以简单地添加以下几行:
InvocationResult result = invoker.execute( request ); if ( result.getExitCode() != 0 ) { throw new IllegalStateException( "Build failed." ); }
这将从调用结果中检索退出代码,如果退出代码不为0(传统的全清除代码),则抛出异常。注意,我们可以通过向请求添加InvocationOutputHandler实例来捕获构建输出。
Caching the Invoker
由于您可以通过Invoker配置为Maven调用指定全局选项,因此配置单个Invoker实例并在多个方法调用中重用它通常是有意义的:
// we will always call the same goals... private static final List<String> PUBLISH_GOALS = Arrays.asList( "clean", "site-deploy" ); // define a field for the Invoker instance. private final Invoker invoker; // now, instantiate the invoker in the class constructor... public SomeClass( File localRepositoryDir ) { Invoker newInvoker = new DefaultInvoker(); newInvoker.setLocalRepositoryDirectory( localRepositoryDir ); this.invoker = newInvoker; } // this method will be called repeatedly, and fire off new builds... public void publishSite( File siteDirectory ) throws PublishException { InvocationRequest request = new DefaultInvocationRequest(); request.setBaseDirectory( siteDirectory ); request.setInteractive( false ); request.setGoals( PUBLISH_GOALS ); InvocationResult result = invoker.execute( request ); if ( result.getExitCode() != 0 ) { if ( result.getExecutionException() != null ) { throw new PublishException( "Failed to publish site.", result.getExecutionException() ); } else { throw new PublishException( "Failed to publish site. Exit code: " + result.getExitCode() ); } } }
正如您所看到的,我们正在使用相同的本地存储库位置(因为站点生成工件很可能对大多数站点都是通用的)。相同的调用程序实例(已配置,我们也可以重用它),以及每次构建的相同目标集。实际上,我们可以适应相当复杂的Invoker配置,而不用以这种方式增加publishSite方法的复杂性。
Configuring the Maven Home Directory(配置Maven主目录)
您可以使用方法Invoker.setMavenHome()来指定它应该使用哪个Maven可执行文件。如果您没有为这个设置提供显式的值,那么Invoker将自动尝试通过评估系统属性Maven .home来检测Maven安装.
注意:如果您在Maven Surefire Plugin运行的测试中使用调用API,您需要告诉Surefire传递系统属性Maven。为了让Maven自动检测工作:
<project> ... <build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-surefire-plugin</artifactId> <version>2.22.2</version> <!-- see surefire-page for available versions --> <configuration> <systemPropertyVariables> <maven.home>${maven.home}</maven.home> </systemPropertyVariables> </configuration> </plugin> </plugins> ... </build> ... </project>