首页 > 编程语言 >Java使用maven-invoker插件进行maven相关操作

Java使用maven-invoker插件进行maven相关操作

时间:2023-04-23 10:48:06浏览次数:47  
标签:Maven 插件 Java request maven Invoker new invoker

官方文档地址: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>

 

标签:Maven,插件,Java,request,maven,Invoker,new,invoker
From: https://www.cnblogs.com/wk-missQ1/p/17345769.html

相关文章

  • 数据结构与算法跳表之java实现
    跳表一个有序链表的搜索、添加、删除的平均时间复杂度都为O(n),那么能否利用二分搜索优化有序链表,将搜索、添加、删除的平均时间复杂度降低至O(logn)呢?链表没有像数组那样的高效随机访问(O(1)时间复杂度),所以不能像有序数组那样直接进行二分搜索优化。那有没有其他办法让有序链表的搜......
  • 十大排序算法快速排序之Java实现
    快速排序快速排序(QuickSort)是对冒泡排序的一种改进,采用的是分治策略(一般与递归结合使用),以减少排序过程中的比较次数。快速排序在1960年由查尔斯·安东尼·理查德·霍尔(CharlesAntonyRichardHoare,缩写为C.A.R.Hoare)提出,昵称为东尼·霍尔(TonyHoare)。算法步骤从数组中选择一个......
  • Java虚拟机之JVM工具监控调优
    我是攻城师(woshigcs)前几篇我们学习了,JVM里面的运行结构,GC算法,以及各种垃圾收集器的优劣点,那么本篇我们来看下如何使用一些虚拟机性能监控工具,来监控和快速处理故障,当JVM出现一些故障时,我们通常从如下的几个方面进行着手分析,包括运行日志,异常堆栈,GC日志,线程快照(threaddump/javacor......
  • Java_final 和 构造代码块
    书上的笔记转移:【REVIEW】:final除了不被重写、不被修改、不被继承、值不可变等等。。。还有以下几个特性: 1.如果成员变量的final修饰未进行赋值,那么是可以在构造方法和构造代码块进行赋值的,如果赋值成功,那么后面都不可能在进行赋值了。 ---2. 静态代码块我知道,就是只执......
  • Java泛型
    Java泛型概念Java泛型是一种在编译时进行类型检查和类型推断的机制,它可以让我们编写更加通用、可重用的代码,提高了代码的可读性和可维护性,同时保证了类型安全。Java泛型的核心思想是类型参数化,即在类、接口或方法的定义中使用类型参数来代替具体的类型,这些类型参数在实例化时被具体......
  • Java 编程问题:四、类型推断
    本章包括21个涉及JEP286或Java局部变量类型推断(LVTI)的问题,也称为var类型。这些问题经过精心设计,以揭示最佳实践和使用var时所涉及的常见错误。到本章结束时,您将了解到将var推向生产所需的所有知识。问题使用以下问题来测试您的类型推断编程能力。我强烈建议您在使用解决方案......
  • java 优雅的记录程序运行时长
    importcn.hutool.core.date.StopWatch;importcn.hutool.core.thread.ThreadUtil;StopWatchtest=newStopWatch("test");test.start("task1");ThreadUtil.sleep(1000);test.stop();test.start("task2");ThreadUtil.sleep(3000);......
  • Java 编程问题:一、字符串、数字和数学
    本章包括39个涉及字符串、数字和数学运算的问题。我们将从研究字符串的一系列经典问题开始,例如计算重复项、反转字符串和删除空格。然后,我们将研究专门用于数字和数学运算的问题,例如两个大数求和和和运算溢出,比较两个无符号数,以及计算除法和模的下限。每个问题都要经过几个解决方......
  • JavaTPoint 数据科学和人工智能中文教程【翻译完成】
    在线阅读在线阅读(Gitee)ApacheCN学习资源目录人工智能DIP教程SAS教程Tableau教程r教程TensorFlow教程NLP教程MATLAB教程强化学习教程Talend教程ANN教程数学计算机教程计算机图形学数据挖掘机器学习NumPy教程PyTorch教程PythonSciPy教程Pandas教程OpenCV教程Matplotlib......
  • JavaTPoint 工具中文教程【翻译完成】
    在线阅读在线阅读(Gitee)ApacheCN学习资源目录Ubuntu上的安装苹果操作系统中的软件安装在CentOS上安装nginx教程Bash教程Git教程LATEX教程SVN教程辅助教程Firebase教程UML教程Tally教程Kubernetes教程Puppet教程GDB教程Nagios教程软件测试Selenium教程敏捷教程JIRA......