为了快速学习自定义 Maven 插件的过程,接下来将实现一个简单的 Hello Maven 插件,功能很简单:输出 Hello World 插件。具体步骤和操作如下。

创建 Maven 新项目,选择 maven-archetype-plugin 项目向导,如图 1 所示。

图 1  选择Archetype

单击 Next 按钮,进入设置 Maven 插件参数界面,输入要创建的插件的 groupId、artifactId 和版本,还有包名,如图 2 所示。

图 2  输入坐标

单击 Finish 按钮,Archetype 插件会自动创建好一个 Maven 插件项目。因为现在用的 Maven 是 3.x 版本的,所以有必要调整 Maven 插件项目必须依赖的 maven-plugin-api 的版本:从 2.x 改成 3.x。这里用的是 3.3.9 版本。样例项目中的 pom 配置如下,注意粗体标识部分。

<?xml version="1.0" encoding="UTF-8"?> 4.0.0cn.com.mvn.pluginMvn.Hello.Plugin0.0.1-SNAPSHOTmaven-pluginMvn.Hello.Plugin Maven Pluginhttp://maven.apache.orgUTF-8org.apache.mavenmaven-plugin-api3.3.9org.apache.maven.plugin-toolsmaven-plugin-annotations3.2providedorg.codehaus.plexusplexus-utils3.0.8junitjunit4.7testorg.apache.maven.pluginsmaven-plugin-plugin3.2Mvn.Hello.Plugintruemojo-descriptordescriptorhelp-goalhelpmojorun-itsorg.apache.maven.pluginsmaven-invoker-plugin1.7true${project.build.directory}/it*/pom.xmlverify${project.build.directory}/local-repo src/it/settings.xmlcleantest-compileintegration-testinstallintegration-testverify

到现在为止,基本上创建好了 Maven 插件项目。

在 cn.com.mvn.plugin.hello 包下,创建 Java 类 HelloName,继承 AbstractMojo,并且在类上面使用 @goal 指定该 Mojo 的目标名称为 name,样例配置代码如下:

package cn.com.mvn.plugin.hello; import org.apache.maven.plugin.AbstractMojo; import org.apache.maven.plugin.MojoExecutionException; import org.apache.maven.plugin.MojoFailureException; /** * @goal name */ public class HelloName extends AbstractMojo { public void execute() throws MojoExecutionException, MojoFailureException { } }

在前面的代码基础上添加一个 name 属性,用来接收运行插件的时候传过来的 name 参数,并且使用 @parameter 将 name 属性标注成配置点,样例配置代码如下:

package cn.com.mvn.plugin.hello; import org.apache.maven.plugin.AbstractMojo; import org.apache.maven.plugin.MojoExecutionException; import org.apache.maven.plugin.MojoFailureException; /** * @goal name */ public class HelloName extends AbstractMojo { /** * @parameter expression="${name}" * @required * @readonly */ String name; public void execute() throws MojoExecutionException, MojoFailureException { } }

在 HelloName 类中的 execute() 方法中添加插件要实现的逻辑代码。这里的 HelloName 的功能很简单,只是打印问候,所以样例配置代码如下:

package cn.com.mvn.plugin.hello; import org.apache.maven.plugin.AbstractMojo; import org.apache.maven.plugin.MojoExecutionException; import org.apache.maven.plugin.MojoFailureException; /** * @goal name */ public class HelloName extends AbstractMojo { /** * @parameter expression="${name}" * @required * @readonly */ String name; public void execute() throws MojoExecutionException, MojoFailureException { System.out.println("Hello" + name); } }

这个插件的目的是打印对 name 的问候。如果 name 为空,或是空字符串,这样的问候就没什么意义了。用户就需要中止问候,并且以日志方式提示用户,样例配置代码如下:

package cn.com.mvn.plugin.hello; import org.apache.maven.plugin.AbstractMojo; import org.apache.maven.plugin.MojoExecutionException; import org.apache.maven.plugin.MojoFailureException; /** * @goal name */ public class HelloName extends AbstractMojo { /** * @parameter expression="${name}" * @required * @readonly */ String name; public void execute() throws MojoExecutionException, MojoFailureException { if (this.name == null || this.name.trim().equals("")) { // 异常处理 throw new MojoExecutionException("name参数必须设置有效的值"); } else { System.out.println("Hello" + name); // 日志处理 this.getLog().info("这是运行日志提示: 执行完问候"); } } }

到现在为止,HelloName Maven 插件的编写就完成了。要进行插件测试的话,还需要将自定义插件安装好,如果要共享给其他开发人员的话,还必须安装到私服或外面的中央仓库中。

运行 mvn install 就可以完成在本地仓库的安装,如果要安装私服或中央仓库,请参考《Apache基金会的Archiva服务器的搭建步骤》和《Maven私服的配置和使用》教程。

在命令行中输入如下命令。

Mvn cn.com.mvn.plugin:Mvn.Hello.Plugin:name -Dname=zhangsan

命令执行效果如下:

[INFO] ————————————————————————

[INFO] [INFO] — Mvn.Hello.Plugin:0.0.1-SNAPSHOT:name (default-cli) @ MvnDemoPlugin —

Hello lisi

[INFO] 这是运行日志提示:执行完问候

[INFO] ————————————————————————

[INFO] BUILD SUCCESS

[INFO] ————————————————————————

[INFO] Total time: 1.139 s

[INFO] Finished at: 2017-01-08T11:55:48+08:00

[INFO] Final Memory: 8M/108M

[INFO] ————————————————————————

创建一个简单的 Maven 项目,在它的 pom 中添加 HelloName 插件如下:

cn.com.mvn.pluginMvn.Hello.Plugin0.0.1-SNAPSHOTnametestlisi

执行 mvn test,可以看到如下日志。

Tests run: 1, Failures: 0, Errors: 0, Skipped: 0

[INFO] [INFO] — Mvn.Hello.Plugin:0.0.1-SNAPSHOT:name (default) @ MvnDemoPlugin —

Hello lisi

[INFO] 这是运行日志提示:执行完问候

[INFO] ————————————————————————

[INFO] BUILD SUCCESS

java自定义maven插件_Maven自定义插件的实现相关推荐

  1. 升级maven编译插件_maven进阶插件

    父子项目都设置properties,子项目会覆盖父项目. 但是使用的jar包要覆盖全,比如logback有classic和core两个模块,之前只覆盖了classic模块,没有添加core的依赖.导致 ...

  2. maven 版本号插件_Maven内部版本号插件–用法示例

    maven 版本号插件 假设我们需要向一些工件(jar,war等)添加内部版本号. 在这里,我想演示buildnumber-maven-plugin的用法. 这篇文章基于: http://mojo.c ...

  3. java自定义maven插件_自定义Maven插件

    第一.自定义Maven插件概述 Mojo:Maven plain Old Java Object.每一个 Mojo 就是 Maven 中的一个执行目标(executable goal),而插件则是对单 ...

  4. java自定义maven插件_java – 自定义Maven插件托管和前缀解析

    我已经编写了自己的自定义Maven插件并将其上传到我的Archiva服务器.它与指定的全名一起工作正常: mvn com.mjolnirr:maven-plugin:manifest 但是当我想通过前 ...

  5. java代码自动生成的插件_如何使用插件生成自定义Java 8代码

    java代码自动生成的插件 大多数程序员讨厌的一件事就是编写样板代码. 无休止的时间花费在设置实体类和配置数据库连接上. 为了避免这种情况,您可以让Speedment Open Source之类的程序 ...

  6. 如何使用插件生成自定义Java 8代码

    大多数程序员讨厌的一件事就是编写样板代码. 无休止的时间花费在设置实体类和配置数据库连接上. 为了避免这种情况,您可以让Speedment Open Source之类的程序为您生成所有这些代码. 这样 ...

  7. 自定义maven插件

    文章目录 maven插件介绍 自定义插件 使用 运行 maven插件介绍 maven插件有很多的作用,maven插件简介 说个用的比较多的,就是jetty插件,通过配置jetty可以通过插件一键运行代 ...

  8. 自定义maven插件:自动生成API的word文档

    继上次开发完Maven插件开发:根据库表生成实体类&根据实体类生成库表之后,博主对开发maven插件喜爱得一塌糊涂.这不,今天给大家带来了<自定义maven插件:自动生成API的word ...

  9. messageformat.format() 自定义参数名_DedeCMS的Java版mcms 第四季之一: 自定义插件

    自定义mcms插件 包含自定义字典.自定义搜索.自定义模型.自定义表单.自定义页面等功能 依赖: Apache Maven <dependency><groupId>net.m ...

最新文章

  1. .Net Reactor 5脱壳教程
  2. [Tips]:SQL server 2005 Create Assembly Failed
  3. Vue之动态class写法总结
  4. Xamarin.Forms 中iOS通过URL Scheme判断应用是否安装
  5. vue取url路径传参_vue不通过路由直接获取url中参数的方法示例
  6. 企业域名更换操作系列4:下载旧域域信息配置
  7. Centos5.6 x86_64下安装DRBD+Heartbeat+NFS
  8. android 事件反拦截
  9. ios动态创建类Class
  10. hiredis中异步的实现小结
  11. Atitit mysql 存储kv 以及php js接口目录kv_mysql.js 1Set.php 1Get.php 2CREATE TABLE `cfg` ( `k`
  12. C语言题目:输入角度a,输出a的正弦值(sin a)
  13. oracle数据库查看建表语句,oracle 查看建表语句
  14. 3dmax:3dmax三维VR渲染设置(VR间接照明GI栏、【VR间接(全局)照明】发光贴图、光子贴图、BF算法、灯光贴图、灯光缓存)之详细攻略(切记收藏!)
  15. 右耳Python小作业--快递分拣
  16. VS2013漂亮字体
  17. 能够打开国内网络,比如百度微信,但是打不开外国网站,该怎么解决(主要是DNS的问题)...
  18. Box2d源码学习十三b2Collision之碰撞(下) 具体形状间的碰撞的实现
  19. UOS Deepin 安装 flatpak
  20. 软件开发工具有哪些?

热门文章

  1. 联发科Helio X30信息曝光 十核大杀器再升级!
  2. 对接饿了么开放平台(Java)
  3. [Unity] Unity中实现羽化功能的shader
  4. 餐饮汇总表mysql_基于某餐饮数据的mysql+powerBI综合案列
  5. python巴特沃斯滤波器_用python在原始信号上应用合适的巴特沃斯滤波器
  6. 整型数据是如何在内存中存储的
  7. 保护森林从这里开始-FSC认证
  8. spring-activiti动态指定审批人及其设计思想
  9. JavaScript 对象合并
  10. 迅雷影音自启动怎么都关不掉?原因及解决方案在这里