教小老弟快速掌握Maven插件

老铁昨天下午问我什么时候讲讲Maven插件:

于是老田搞到大半夜终于写了一篇maven的插件,今天分享给大家。

Maven 是一个执行插件的框架,每一个任务实际上是由插件完成的。那么我们今天就来聊聊Maven插件。

什么是Maven插件?

Maven 实际上只是Maven插件集合的核心框架。换句话说,插件是执行大部分实际操作的地方。

插件用于:

  • 创建jar文件,
  • 创建war文件,
  • 编译代码,
  • 单元测试代码,
  • 创建项目文档等。

插件是Maven的核心功能,它允许在多个项目中重用通用的构建逻辑。他们通过在项目描述(项目对象模型(POM))的上下文中执行“操作”(即创建WAR文件或编译单元测试)来实现此目的。可以通过一组唯一的参数来自定义插件的行为,这些参数通过每个插件目标(或Mojo)的描述公开。

一个插件通常提供了一组目标,可使用以下语法来执行:

 
 
 
 
  1. mvn [plugin-name]:[goal-name] 

例如:一个 Java 项目可以使用 Maven 编译器插件来编译目标,通过运行以下命令编译

 
 
 
 
  1. mvn compiler:compile 

插件有哪些类型

Maven 提供以下两种类型插件:

以下是一些常见的插件列表:

例如

我们使用 maven-antrun-plugin 插件在例子中来在控制台打印数据。现在在 C:\MVN\project 文件夹 创建一个 pom.xml 文件,内容如下:

 
 
 
 
  1.     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
  2.     xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 
  3.     http://maven.apache.org/xsd/maven-4.0.0.xsd"> 
  4. 4.0.0 
  5. com.companyname.projectgroup 
  6. project 
  7. 1.0 
  8.  
  9.  
  10.     
  11.    org.apache.maven.plugins 
  12.    maven-antrun-plugin 
  13.    1.1 
  14.     
  15.        
  16.          id.clean 
  17.          clean 
  18.           
  19.             run 
  20.           
  21.           
  22.              
  23.                clean phase 
  24.              
  25.           
  26.             
  27.     
  28.     
  29.  
  30.  
  31.  

接下来,打开命令终端跳转到 pom.xml 所在的目录,并执行下面的 mvn 命令。

 
 
 
 
  1. mvn clean 

Maven 将开始处理并显示 clean 生命周期的 clean 阶段。

 
 
 
 
  1. [INFO] Scanning for projects... 
  2. [INFO] ------------------------------------------------------------------ 
  3. [INFO] Building Unnamed - com.companyname.projectgroup:project:jar:1.0 
  4. [INFO]    task-segment: [post-clean] 
  5. [INFO] ------------------------------------------------------------------ 
  6. [INFO] [clean:clean {execution: default-clean}] 
  7. [INFO] [antrun:run {execution: id.clean}] 
  8. [INFO] Executing tasks [echo] clean phase 
  9. [INFO] Executed tasks 
  10. [INFO] ------------------------------------------------------------------ 
  11. [INFO] BUILD SUCCESSFUL 
  12. [INFO] ------------------------------------------------------------------ 
  13. [INFO] Total time: < 1 second 
  14. [INFO] Finished at: Sat Jul 07 13:38:59 IST 2020 
  15. [INFO] Final Memory: 4M/44M 
  16. [INFO] -------- 

上面的例子展示了以下关键概念:

  • 插件是在 pom.xml 中使用 plugins 元素定义的。
  • 每个插件可以有多个目标。
  • 你可以定义阶段,插件会使用它的 phase 元素开始处理。我们已经使用了 clean 阶段。
  • 你可以通过绑定到插件的目标的方式来配置要执行的任务。我们已经绑定了 echo 任务到 maven-antrun-plugin 的 run 目标。
  • 就是这样,Maven 将处理剩下的事情。它将下载本地仓库中获取不到的插件,并开始处理。

插件与目标

一个插件通常可以完成多个任务,每一个任务就叫做插件的一个目标。如执行mvn install命令时,调用的插件和执行的插件目标如下 :

将插件绑定到生命周期

Maven的生命周期是抽象的,实际需要插件来完成任务,这一过程是通过将插件的目标(goal)绑定到生命周期的具体阶段(phase)来完成的。如:将maven-compiler-plugin插件的compile目标绑定到default生命周期的compile阶段,完成项目的源代码编译:

内置绑定

Maven对一些生命周期的阶段(phase)默认绑定了插件目标,因为不同的项目有jar、war、pom等不同的打包方式,因此对应的有不同的绑定关系,其中针对default生命周期的jar包打包方式的绑定关系如下:

在第二列中,冒号前面是插件的前缀(prefix),是配置和使用插件的一种简化方式;冒号后面即是绑定的插件目标。

你的仓库中有哪些maven插件?

 
 
 
 
  1. 存放目录=%本地仓库%\org\apache\maven\plugins 

Maven官网上有更详细的官方插件列表:

自定义插件

在前面我们提到了一个Mojo,Mojo实际上是一个Maven的目标,插件包含任意数量的目标(Mojos)。Mojos可以定义为带注释的java类或Beanshell脚本。Mojo指定有关目标的元数据:目标名称,它适合生命周期的哪个阶段,以及它期望的参数。

Mojo术语是在maven2中引入,它是对如何编写插件的完整重写。Mojo是对Pojo(plain-old-java-object)的一种改进,它将maven替换为plain。

一个 Mojo 包含一个简单的 Java 类。插件中多个类似 Mojo 的通用之处可以使用抽象父类来封装。Maven插件项目的打包方式packaging必须为maven-plugin。

实现自定义插件

创建maven项目,添加依赖:

 
 
 
 
  1.          xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd"> 
  2.     4.0.0 
  3.     com.tian.maven 
  4.     my-maven-plugin 
  5.     maven-plugin 
  6.     1.0-SNAPSHOT 
  7.     my-maven-plugin 
  8.     http://maven.apache.org 
  9.      
  10.          
  11.             junit 
  12.             junit 
  13.             3.8.1 
  14.             test 
  15.          
  16.          
  17.          
  18.             org.apache.maven 
  19.             maven-plugin-api 
  20.             3.0 
  21.          
  22.  
  23.          
  24.          
  25.             org.apache.maven.plugin-tools 
  26.             maven-plugin-annotations 
  27.             3.4 
  28.             provided 
  29.          
  30.      
  31.  

TianMojo继承了 AbstractMojo 这个抽象类,并实现了 execute() 方法,该方法就是用来定义这个 Mojo 具体操作内容,我们只需要根据自己的需要来编写自己的实现即可。

 
 
 
 
  1. //自定义插件类 
  2. //name就是后面使用该插件的时候excuation里面的 
  3. @Mojo(name = "tian") 
  4. public class TianMojo extends AbstractMojo 
  5.     // 配置的是本maven插件的配置,在pom使用configration标签进行配置 property就是名字, 
  6.     // 在配置里面的标签名字。在调用该插件的时候会看到,还可以设置默认值 
  7.     @Parameter(property = "userName",defaultValue = "田哥你好") 
  8.     private String userName; 
  9.     @Parameter(property = "pwd",defaultValue = "000000") 
  10.     private String pwd; 
  11.  
  12.     @Override 
  13.     public void execute() throws MojoExecutionException, MojoFailureException { 
  14.         System.out.println("userm=" + userName + " pwd=" + pwd); 
  15.         System.out.println("my plugin is running"); 
  16.     } 

然后在执行mvn clean install命令。

使用自定义插件

在我们的maven项目添加我们自定义的插件:

 
 
 
 
  1.  
  2.      
  3.        
  4.         com.tian.maven 
  5.         my-maven-plugin 
  6.         1.0-SNAPSHOT 
  7.          
  8.            
  9.                
  10.             install 
  11.              
  12.                
  13.               tian 
  14.              
  15.            
  16.          
  17.          
  18.          
  19.           田维常 
  20.           123456 
  21.          
  22.        
  23.      
  24.  

然后就可以在我们的IDEA中看到:

双击my:tian:

还可以使用命令的方式:mvn my:tian

my是前缀,是my-maven的缩写。后缀tian就是插件绑定的目标。

到此,我们的自定义Maven插件就搞定了。

总结

Maven插件是Maven的核心功能,插件类型有构建类型和报告类型,插件可以有多个目标也就是可以理解为多个功能。自定义插件主要两步:依赖相关jar包和重写Mojo。自定义的插件的使用和我们用其他插件使用一样,只要在pom中配置相关 配置即可。

只有真正理解了插件实现原理后,才能慢慢去体会猜测我们平时使用的那些mvn...命令背后是如何实现的。

本文转载自微信公众号「Java后端技术全栈」,可以通过以下二维码关注。转载本文请联系Java后端技术全栈公众号。

新闻标题:教小老弟快速掌握Maven插件
网站链接:http://www.mswzjz.cn/qtweb/news34/365234.html

攀枝花网站建设、攀枝花网站运维推广公司-贝锐智能,是专注品牌与效果的网络营销公司;服务项目有等

广告

声明:本网站发布的内容(图片、视频和文字)以用户投稿、用户转载内容为主,如果涉及侵权请尽快告知,我们将会在第一时间删除。文章观点不代表本网站立场,如需处理请联系客服。电话:028-86922220;邮箱:631063699@qq.com。内容未经允许不得转载,或转载时需注明来源: 贝锐智能