`
somebody_hjh
  • 浏览: 182075 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

Maven和Maven插件

    博客分类:
  • Java
阅读更多
人生是一张茶几,上面摆满了杯具,请让我们的杯具与众不同。
这是我这篇博文的一个主题。

我们知道maven是一个项目管理的工具,他把项目抽象为一个个的生命周期和阶段。我们先来介绍一下maven最重要的几个概念:

    1、lifecycle 生命周期,一个项目在maven中有三个生命周期,分别为default,clean,site。default主要是编译和部署生命周期,clean是清理生命周期,site是生成报表、工程文档等生命周期。
    2、phase 生命周期中阶段。如default的生命周期中拥有validate、initialize、compile、test-compile、prepare-package、package、install、deploy等等的阶段。阶段是顺序执行的。
    3、goal 阶段中的目标。每一个阶段中,蕴含着一个或多个目标。
    4、mojo 执行目标的具体代类

形象的来一个比喻,如同下面一张图所示:



一个项目的生命周期如同一个人的生命周期(lifecycle),分为多个阶段(phase),如3岁前是幼儿期,4-22岁是幼年期,23-53是中轻年期,51-70是老年期。而每个阶段(phase)我们又会有不一样的目标(goal),比如幼儿期,我们的目标(goal)是喝奶,幼年期的目标(goal)是读书、长大,中年期的目标是结婚生子等等等等。这些组成我们人生的杯具。但是我们作为一个杯具的执行者(mojo),还得一步一步的去走我们的各个阶段,实现我们的各个目标。

项目都有标准的生命周期,编译前检查、资源生成、编译、部署、发布等等。但是每个项目又是如此不同,我们怎样改变我们的项目,使得这一个个的杯具有所不同呢?我们可以使用maven的插件和编写maven的插件来实现。比如我们想在编译前,去读取一台网络设备的配置;再或则需要收集其他资源等等。maven插件让我们项目丰富多彩,跟我们人生的杯具一样,请让我们的杯具与众不同。

讲解了maven的一些概念以后,我们进入maven插件的编写讲述上。

maven插件,也是以mojo来体现的,写插件就是写mojo。那为什么maven的标准mojo成为标准的生命周期中的goal实现,而我们的插件就跟二奶一样,不被承认,只能叫做插件呢。

比如我们在运行:maven install的时候,到底运行了什么?我们让maven执行默认生命周期中的一个阶段(phase),这个阶段叫install,而这个阶段默认绑定了一个目标(goal),目标的名称也叫install。也就是说我们让maven唤醒项目的一次install目标。如执行maven install:install。maven会根据默认的生命周期阶段,先执行先前的阶段(validate,initialize...),然后执行编译和安装。插件的运行方式类似,如maven eclipse:eclipse 我们让maven唤起运行eclipse的插件,生成eclipse的项目文件。他们运行方式如此的相似,是因为他们本来就是同样的东西--mojo。

插件跟标准流程如同二奶跟合法妻子一样。
1、他们都是不被承认的
2、他们的存在都是为了解决需求
3、他们都是女人



1、插件也是不被maven承认的
2、它们都是为了解决项目的需求
3、它们都是mojo

了解了我们的maven部分概念和插件的定位之后,我们来写我们的第一个maven插件。插件之hello world。

所有的mojo都应该继承自org.apache.maven.plugin.AbstractMojo,我们来建立我们的maven插件工程。
mvn archetype:create -DgroupId=com.alibaba.maven.plugins -DartifactId=greeting-maven-plugin -DarchetypeGroupId=org.apache.maven.archetypes -DarchetypeArtifactId=maven-archetype-mojo


跟普通Maven的项目一样,自己定义groupId和artifactId。我们这里分别定义groupId为com.alibaba.maven.plugins和greeting-maven-plugin。
archetypeGroupId和archetypeArtifactId用来定位用哪个maven的工程模板来建立项目。当然我们使用的是maven-archetype-mojo模板来建立插件项目。

/** @author xingming.zhaoxm 
*   @goal sayHello 
*/ 
public class HelloWorldMojo extends AbstractMojo{
 @Override    
public void execute() throws MojoExecutionException, MojoFailureException { 
      getLog().info("Hello World!");    
}}


Ok,如上所示我们复写了execute方法,最重要@goal的一个annotation,它定义了这个mojo跟goal一一对应的关系。现在我们运行命令mvn install 把该插件先发布到本地库。之后我们便可以执行我们的插件了。

插件的运行方式为:mvn groupID:artifactID:version:goal
按照我们的项目,那么我们运行插件应该:mvn com.alibaba.maven.plugins:greeting-maven-plugin:1.0-SNAPSHOT:sayHello

看看,我们是不是已经在控制台看到我们打出的"Hello World"文字了。想想,为什么mvn eclipse:eclipse的插件运行方式可以这么简单。

怎么减少输入呢?

首先,我们在maven的setting.xml配置文件中,可以找到这样一个配置项:
<pluginGroups>
    <pluginGroup>*</pluginGroup>
  </pluginGroups>

如果这里配置上我们的groupID,如我们的com.alibaba.maven.plugins,那么groupId的输入便可省略了。
另外,我们的项目名称DartifactId如果以${name}-maven-plugin或以maven-${name}-plugin的格式命名,我们便能省去-maven-plugin等信息。
version本来可以省略,maven会找到最新的版本来执行。
那么省略后的执行命令就可以这样写了:mvn greeting:sayHello
Ok,那么我要运行插件时输入参数,该怎么处理呢?如同 mvn install -Dmaven.test.skip=true。我们重写我们的mojo,加入@parameter的annotation。如下

/** 
* @author xingming.zhaoxm 
* @goal sayHello 
*/ 
public class HelloWorldMojo extends AbstractMojo{    
/**     
* @parameter default-value="Somebody" expression="${username}     
*/
private String userName;   
@Override    
public void execute() throws MojoExecutionException, MojoFailureException {
        getLog().info("Hello World!"+userName);    
}}


在install一把,然后运行
mvn greeting:sayHello -Dusername=白痴

看看是否已经ok了。

上面的插件都在命令行模式下运行,下面我再把项目中运行的插件方式和方法做一个简要的梳理。这些类似的插件有很多,比如jetty插件,各种reporting插件等等。
我们先创建一个测试工程,用于应用和测试我们写的HelloWrold插件。
mvn archetype:create -DgroupId=com.alibaba -DartifactId=test

然后在pom文件中加入插件的依赖,如下
<build>      
 <plugins>          
  <plugin>              
      <groupId>com.alibaba.maven.plugins</groupId>        
      <artifactId>greeting-maven-plugin</artifactId>        
      <version>1.0-SNAPSHOT</version>      
        <executions>          
         <execution>            
          <phase>initialize</phase>          
            <goals>              
            <goal>sayHello</goal>           
           </goals>         
         </execution>       
       </executions>     
     </plugin>   
   </plugins> 
</build>


对该项目进行编译,mvn install 后,我们会发现在项目的initialize阶段,便会打印出hello world!的信息。插件绑定到了特定的phase,如果我们不通过编译该测试工程运行插件,我们依然通过命令行,比如 mvn greeting:sayHello,我们会发现,在绑定phase阶段的先前阶段会先顺序执行后,才开始运行插件。
插件配置中也可以配置参数,优先级以配置项为先,而命令行参数为后。如我们可以这样配置插件参数:
<build>   
   <plugins>      
    <plugin>       
       <groupId>com.alibaba.maven.plugins</groupId>
       <artifactId>greeting-maven-plugin</artifactId>       
       <version>1.0-SNAPSHOT</version>
       <configuration> 
            <userName>阿娇</userName>
       </configuration>        
      <executions>          
        <execution>          
            <phase>initialize</phase>           
           <goals>              
            <goal>sayHello</goal>           
           </goals>         
         </execution>        
      </executions>      
    </plugin>   
   </plugins> 
 </build>


讲完了插件以后,一些分享没有涉及的知识点可以去参考maven的官方文档。比如annotation中没有涉及的一些点。可参考http://maven.apache.org/developers/mojo-api-specification.html

最后本想把一些插件的源码拿出来解析一把,以后有时间再写吧。或许读者们可以把这个事情当做自己的提高手段。




  • 大小: 12.3 KB
  • 大小: 28.3 KB
  • 大小: 7.9 KB
8
4
分享到:
评论
10 楼 少年中国 2015-11-06  
赞一个!
8 楼 C370228492 2013-07-08  
7 楼 young7 2012-10-15  
楼主写得文采斐然阿!太幽默了呵呵
6 楼 您已经登录 2012-09-19  
插件中的每个任务goal称作一个 Mojo(Maven plain Old Java Object)。目标和Mojo其实是同一个东西。而你这篇文章中的goal是插件名称
5 楼 mnieguomin 2012-04-05  
yuky1327 写道
这文章不是把人家官网的教程贴过来,我直接看官网都写出来了。

你写得出来,为什么不写呢,大哥!
4 楼 yuky1327 2011-08-03  
这文章不是把人家官网的教程贴过来,我直接看官网都写出来了。
3 楼 flashing 2011-02-28  
好文,很有帮助。
2 楼 飞天奔月 2011-01-28  
这文章写得太绝了
1 楼 magibt 2010-08-01  
写的太棒了,对maven的理解有很大的帮助

相关推荐

    eclipse安装maven插件需要包

    5. **测试Maven插件**: 创建一个新的Maven项目,如果Eclipse能够自动生成`pom.xml`文件并正常识别依赖,那么Maven插件就已成功安装和配置。 总结,离线安装Eclipse的Maven插件是一种在无网络或网络不稳定情况下的...

    安装Jenkins的git和maven插件

    本文将详细讲解如何在Jenkins中安装Git和Maven插件,以便实现版本控制与构建管理。 首先,让我们了解Jenkins插件的作用。Jenkins通过插件扩展其功能,提供对各种工具和技术的支持。Git插件允许Jenkins与Git仓库进行...

    eclipse-maven插件

    Eclipse是一款广泛使用的Java开发集成环境,而Maven是一个强大的项目管理和构建工具,它通过一个中央仓库...在日常开发中,记得定期更新Maven插件以获取最新的功能和修复,保持与Maven的同步,以确保最佳的开发体验。

    eclipse离线安装maven插件(m2e),maven插件离线安装包

    现在eclipse的社区版都不内置maven插件了,站点在线安装实在是太痛苦了(我装了6个小时),于是急于寻找一种离线安装的办法,可是在网上又找不到对应的m2e包(我用的...现把我爬下来的maven插件,和安装说明分享给大家

    Myeclipse maven插件下载

    总之,MyEclipse集成Maven插件为开发者提供了更高效的工作环境,使得在IDE内就能完成大部分项目管理和构建任务,提高了开发效率。通过熟悉和掌握这些知识,可以更好地利用MyEclipse和Maven提升软件开发质量。

    eclipse的maven插件

    6. **集成源码和Javadoc**:Maven插件可以帮助自动下载并关联依赖库的源码和Javadoc,这对于理解和调试第三方库非常有帮助。 7. **支持Maven profiles**:Eclipse的Maven插件同样支持Maven的profiles特性,可以根据...

    jenkins 离线安装maven插件集合jenkins-maven.zip

    Maven插件是Jenkins与Apache Maven集成的关键,使得Jenkins能够无缝地管理和运行Maven项目,包括构建、测试和部署。 离线安装Jenkins插件的过程分为以下几个步骤: 1. **下载插件**: 在有网络的环境里,访问...

    IDEA插件推荐之Maven-Helper的教程图解

    Maven-Helper 插件是 IntelliJ IDEA 中的一款功能强大且实用的插件,旨在帮助开发者更好地管理 Maven 项目的...通过 Maven-Helper 插件,开发者可以快速查看和管理项目中的依赖关系,从而提高项目的稳定性和可靠性。

    eclipse离线安装maven插件详解(内附maven插件包)

    本篇文章将详细解析如何在Eclipse中离线安装Maven插件,同时提供内附的Maven插件包,以解决在线安装过程中的速度问题和可能遇到的错误。 首先,我们需要准备的是Maven的安装。Maven是Apache开源的一个项目管理工具...

    Myeclipse6.5的Maven插件

    总结来说,MyEclipse 6.5的Maven插件是Java开发者必备的工具之一,它简化了项目构建和依赖管理,提高了开发效率,而其离线安装和良好的拔插性更是为不同环境下的开发工作提供了便利。正确理解和熟练使用Maven插件,...

    eclipse中Maven安装插件和maven.zip

    安装完Maven插件后,你需要配置Maven的本地仓库和settings.xml文件。Eclipse会在你的用户目录下创建一个`.m2`文件夹,其中包含settings.xml文件。你可以在这里配置你的Maven仓库路径,代理服务器设置等。 接下来,...

    自定义maven插件的实现

    然而,有时候Maven的内置插件无法满足特定的需求,这时就需要自定义Maven插件来扩展其功能。本篇文章将深入探讨如何实现自定义的Maven插件。 首先,了解Maven插件的基本结构至关重要。一个Maven插件通常由一组Mojo...

    apache-maven的插件包:apache-maven-3.3.9-bin.zip

    Maven 的插件系统是其核心功能之一,允许开发者通过安装和配置各种插件来扩展Maven的功能。 标题中的"apache-maven-3.3.9-bin.zip"是一个包含Apache Maven 3.3.9版本的二进制发行包。这个版本发布于2015年,是Maven...

    maven离线安装插件

    4、在links中新建maven.txt文件,内容为插件地址,例如:path=D:\eclipse_gzds\myplugins\maven(注意这里斜杠,不是反斜杠) 5、将maven.txt扩展名改为maven.lin 6、在eclipse根目录下找到eclipse.ini并打开,在...

    eclipse安装的maven插件

    本教程将详细介绍如何在低版本的Eclipse中安装和配置Maven插件。 首先,我们需要了解为何要在Eclipse中安装Maven插件。Maven提供了一种标准的方式来管理项目依赖、构建过程和项目信息。通过Maven插件,Eclipse用户...

    maven 安装包 和 eclipse 插件

    本文将详细介绍如何安装与配置Maven安装包和Eclipse Maven插件。 首先,我们来看Apache Maven 3.1.0的安装。这个版本的Maven包含了所有必要的文件和库,可以在各种操作系统上运行。下载的压缩包名为`apache-maven-...

    Maven和Tomcat插件

    总结来说,Maven和Tomcat插件的结合使用,能够帮助开发者高效地构建、管理、部署Java Web项目。通过合理配置POM文件,我们可以实现自动化构建流程,提高开发效率,同时保持项目的一致性和可维护性。

    eclipse安装maven插件

    Eclipse作为流行的Java集成开发环境(IDE),通过安装Maven插件,可以让开发者在Eclipse内部方便地进行Maven项目的开发和管理。下面我们将详细介绍如何在Eclipse中安装Maven插件。 首先,我们需要知道为什么要在...

    java Maven中常用命令和插件

    java Maven中常用命令和插件java Maven中常用命令和插件java Maven中常用命令和插件java Maven中常用命令和插件java Maven中常用命令和插件java Maven中常用命令和插件java Maven中常用命令和插件java Maven中常用...

Global site tag (gtag.js) - Google Analytics