maven编译插件,maven安装插件

  maven编译插件,maven安装插件

  

目录

Maven插件的Maven规范Mojo是什么?为Mojo项目创建Maven插件的命名规范什么是Mojo?创建Mojo项目很简单。创建Mojo并运行自定义插件shorten执行命令Maven是一款优秀的项目管理工具,其插件机制为其功能扩展提供了极大的便利。

 

  虽然在大多数情况下,我们可能不会自己编写Maven插件,但也不排除在一些特殊情况下,需要自己完成插件来帮助我们处理一些常见的事情。

  正好最近有一些需求可能需要扩展Drools的一个Maven插件,所以学习一下Maven插件的编写。

  00-1010一般来说,我们会将自己的插件命名为-Maven-plugin,但我们不建议使用Maven-plugin,因为后者是Maven团队维护官方插件的保留命名方式,使用这种命名方式会侵犯Apache Maven商标。

  

Maven 插件的命名规范

Mojo是Maven普通旧Java对象。每个Mojo都是Maven中的一个可执行目标,插件统一分发一个或多个相关的Mojo。Mojo包含一个简单的Java类。插件中很多类似于Mojo的相似之处都可以用抽象父类封装。

 

  00-1010这里我们用Idea作为开发工具进行讲解,创建一个项目并选择Maven,然后在模板中找到Maven-architect-mojo,点击下一步,输入相应的参数,比如com.qchery/ekjar-maven-plugin/1.0-SNAPSHOT,最后点击完成创建一个简单的Mojo项目。

  00-1010一般来说,我们会将自己的插件命名为-Maven-plugin,但我们不建议使用Maven-plugin,因为后者是Maven团队维护官方插件的保留命名方式,使用这种命名方式会侵犯Apache Maven商标。

  

什么是 Mojo?

Mojo是Maven普通旧Java对象。每个Mojo都是Maven中的一个可执行目标,插件统一分发一个或多个相关的Mojo。Mojo包含一个简单的Java类。插件中很多类似于Mojo的相似之处都可以用抽象父类封装。

 

  00-1010这里我们用Idea作为开发工具进行讲解,创建一个项目并选择Maven,然后在模板中找到Maven-architect-mojo,点击下一步,输入相应的参数,比如com.qchery/ekjar-maven-plugin/1.0-SNAPSHOT,最后点击完成创建一个简单的Mojo项目。

  创建完成后,项目中将会生成相应的pom.xml文件。它的内容比较简单,除了对maven-plugin-api的依赖是自动添加的之外,基本和常见Maven项目的pom.xml一致。这个依赖关系会包含一些Mojo的接口和抽象类,后面写具体的Mojo的时候会详细解释。

  依赖关系groupIdorg.apache.maven/groupId ArtifactidMaven-plugin-API/ArtifactidVersion 2.0/Version/Dependency它和普通pom.xml文件的一个重要区别就是它的打包方式:

  打包maven-插件/打包

  00-1010项目创建后,我们开始了Mojo创建之旅。如上所述,Mojo是一个简单的Java类,所以我们创建了第一个Mojo类来打印一行输出。

  导入org . Apache . maven . plugin . abstract mojo;import org . Apache . maven . plugin . mojoexecutionexception;import org . Apache . maven . plugin . mojo failure exception;/* * * * @目标

   hello */public class HelloMojo extends AbstractMojo {    public void execute() throws MojoExecutionException, MojoFailureException {        System.out.println("hello world");    }}观察一下这个类,我们发现它继承了 AbstractMojo 这个抽象类,并实现了 execute() 方法,该方法就是用来定义这个 Mojo 具体操作内容,我们只需要根据自己的需要来编写自己的实现即可。

  Mojo 操作的实现我们了解了,那怎么让 Maven 知道这是一个 Mojo 而不是一个普通的 Java 类呢?这里,就需要说一下 Mojo 的查找机制了,在处理源码的时候,plugin-tools 会把使用了 @Mojo 注解或 Javadoc 里包含 @goal 注释的类来当作一个 Mojo 类。在上面的例子中,我们使用了 Javadoc 的方法来声明一个 Mojo。同样我们也可以使用 @Mojo 注解来进行声明:

  

@Mojo(name = "hello")public class HelloMojo extends AbstractMojo {    public void execute() throws MojoExecutionException, MojoFailureException {        System.out.println("hello world");    }}

使用 @Mojo 注解,我们需要引入一个新包:

 

  

<dependency>  <groupId>org.apache.maven.plugin-tools</groupId>  <artifactId>maven-plugin-annotations</artifactId>  <version>3.1</version></dependency>

 

  

运行自定义 Plugin

与使用其它插件类似,我们需要在 pom.xml 文件中引入插件:

 

  

<build>    <plugins>        <plugin>            <groupId>com.qchery</groupId>            <artifactId>ekjar-maven-plugin</artifactId>            <version>1.0-SNAPSHOT</version>        </plugin>    </plugins></build>

先执行命令:

 

  

mvn install

然后执行:

 

  

mvn com.qchery:ekjar-maven-plugin:1.0-SNAPSHOT:hello

即可看到输出:

 

  

[INFO] Scanning for projects...[INFO] [INFO] ------------------------------------------------------------------------[INFO] Building ekjar-maven-plugin Maven Mojo 1.0-SNAPSHOT[INFO] ------------------------------------------------------------------------[INFO][INFO] --- ekjar-maven-plugin:1.0-SNAPSHOT:hello (default-cli) @ ekjar-maven-plugin ---hello world[INFO] ------------------------------------------------------------------------[INFO] BUILD SUCCESS[INFO] ------------------------------------------------------------------------[INFO] Total time: 0.249 s[INFO] Finished at: 2017-03-26T12:59:47+08:00[INFO] Final Memory: 6M/123M[INFO] ------------------------------------------------------------------------

 

  

 

  

缩短执行命令

在刚才运行插件的时候,我们使用全量的插件指引,但这个实在是太长太繁琐了,那我们是否可以缩短我们的执行命令呢?

 

  答案肯定是可以的,如果你想要执行的是你本地库中最新版本的插件,那么你可以删除掉版本号;如果你的命名满足前面提及的两种命令方式,你可以直接使用插件名及 goal 名来运行对应的插件,如:

  

mvn ekjar:hello

你会得到与之前完全一样的结果。

 

  绑定 Maven 执行周期

  你还可以将插件配置为将特定目标,从而附加到构建生命周期中的某个特定阶段。如:

  

<build>    <plugins>        <plugin>            <groupId>com.qchery</groupId>            <artifactId>ekjar-maven-plugin</artifactId>            <version>1.0-SNAPSHOT</version>            <executions>                <execution>                    <goals>                        <goal>hello</goal>                    </goals>                    <phase>package</phase>                </execution>            </executions>        </plugin>    </plugins></build>

继承AbstractMojo 的类中,参数可以通过命令赋值,例如:

 

  

/** * * @goal echo * @phase process-sources */public class MyMojo extends AbstractMojo {    /**     * @parameter expression="${echo.message}" default-value="Hello World..."     */    private String message;    public void execute() throws MojoExecutionException, MojoFailureException {        System.out.println("hello world");        getLog().info("hello mymojo : "+message);    }}

其中注释就是maven插件很重要的元数据

 

  

/** * @goal CustomMavenMojo:表示该插件的服务目标 * @phase compile:表示该插件的生效周期阶段 * @requiresProject false:表示是否依托于一个项目才能运行该插件 * @parameter expression="${name}":表示插件参数,使用插件的时候会用得到 * @required:代表该参数不能省略 */

执行:

 

  

mvn com.handarui.yanquan:yanquan:1.0-SNAPSHOT:echo -Decho.message="The Eagle has Landed"

(MyMojo类中的message 参数的javadoc注释是 echo.message, 通过命令赋值时,需要传入-Decho.message=XXX 这种形式 )

 

  以上为个人经验,希望能给大家一个参考,也希望大家多多支持盛行IT。

郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

留言与评论(共有 条评论)
   
验证码: