【maven实战】16-插件目标与插件绑定

maven的核心仅仅定义了抽象的生命周期,具体的任务是交由插件完成的,插件以独立的构件形式存在,因此maven核心的分发包只有3M左右,maven会在需要的时候下载并使用插件。

对于插件本身,为了能够服用代码他往往能够完成多个任务。例如maven-dependency-plugin,它能够基于项目依赖做很多事情。它能够分析项目依赖,帮助找出潜在的无用依赖等等;它能列出项目的依赖树,帮助分析依赖来源;它能够列出项目所有已解析的依赖等等。为每个这样的功能编写一个独立的插件显然是不可取的,因为这些任务背后有很多可以复用的代码,因此这些功能聚集在一个插件里,每个功能就是一个插件目标

maven-dependency-plugin有十多个目标,每个目标对应了一个功能,上述提到的几个功能分别对应的插件目标为dependency:analyze,dependency:tree,dependency:list。这是一种通用的写法,冒号前面是插件前缀,冒号后面是该插件的目标。

maven的生命周期与插件相互绑定,用以完成实际的构建任务。具体而言是生命周期的阶段与插件目标项目绑定,以完成某个具体的构建任务。例如项目编译这一任务它对应了default生命周期的compile这一阶段,而maven-compiler-plugin这一插件的compile目标能够完成个该任务。因此将他们绑定就能实现项目编译的目的,如下图:

 

内置绑定:为了能让用户几乎不用配置就能构建maven项目,maven核心为一些主要的生名周期阶段绑定了很多插件目标,当用户通过命令行调用生命周期阶段的时候,对应的插件目标就会执行相应的任务。

Maven在核心为一些主要的生命周期阶段绑定了很多插件的目标

clean生命周期阶段与插件目标的绑定关系

 

生命周期阶段插件目标
pre-clean 
cleanmaven-clean-plugin:clean
post-clean 

site生命周期阶段与插件目标的绑定关系 

 

生命周期阶段插件目标
pre-site 
sitemaven-site-plugin:site
post-site 
site-deploymaven-site-plugin:deploy

default生命周期与内置插件绑定关系及具体任务(打包类型: jar)

 

 

 

生命周期阶段插件目标执行任务
process-resourcesmaven-resources-plugin:resources复制主资源文件至主输出目录
compilemaven-compile-plugin:compile编译主代码至主输出目录
process-test-resourcesmaven-resources-plugin:testRresources复制测试资源文件至测试输出目录
test-compilemaven-compiler-plugin:testCompile编译测试代码至测试输出目录
testmaven-surefire-plugin:test执行测试用例
packagemaven-jar-plugin:jar创建项目jar包
installmaven-install-plugin:install将项目输出构件安装到本地仓库
deploymaven-deploy-plugin:deploy将项目输出构件部署到远程仓库

自定义绑定:除了内置绑定以外,用户还能够自己选择将某个插件目标绑定到生命周期的某个阶段上,一个常见的例子是创建项目的源码jar包,内置的插件绑定关系中并没有涉及这一任务,因此需要用户自行配置。maven-source-plugin可以帮助我们完成该任务,他的jar-no-fork目标能够将项目的主代码打包成jar文件,可以将其绑定到default生命周期的verify阶段上,在执行完成集成测试后和安装构件前创建源码jar包。具体配置如下:

 

<build>  
<plugins>  
    <plugin>  
        <groupId>org.apache.maven.plugins</groupId>  
        <artifactId>maven-source-plugin</artifactId>  
        <version>2.1.1</version>  
        <executions>  
            <execution>  
                <id>attach-sources</id>  
                <phase>verify</phase>  
                <goals>  
                    <goal>jar-no-fork</goal>  
                </goals>  
            </execution>  
        </executions>  
    </plugin>  
</plugins>  
  </build>

执行mvn命令

mvn clean install

从控制台输出可以看到在插件maven-jar-plugin插件执行jar目标后,紧接着执行verify阶段的jar-no-fork目标:

 

 

[INFO]  
[INFO] --- maven-jar-plugin:2.3.2:jar (default-jar) @ bus-location ---  
[INFO] Building jar: G:\bus-location\target\bus-location-1.0.jar  
[INFO]  
[INFO] --- maven-source-plugin:2.1.1:jar-no-fork (attach-sources) @ bus-location  
 ---  

当执行verify生命周期阶段的时候,maven-source-plugin:jar-no-fork会得以执行,他会创建一个以-sources.jar结尾的源码文件包。
有时候即使不同过phase元素配置生命周期阶段,插件目标也能够绑定到生命周期中去。例如可以删除上述配置中的phase一行,再次自行mvn verify仍然可以看到maven-source-plugin:jar-no-fork得以执行。出现这种现象的原因是:有很多插件的目标在编写时已经定义了默认绑定阶段。可以使用maven-help-plugin查看插件详细信息,了解插件目标的默认绑定阶段。运行命令如下:

 

 

mvn help:describe -Dplugin=org.apache.maven.plugins:maven-source-plugin:2.1.1 -Ddetail
source:jar-no-fork
  Description: This goal bundles all the sources into a jar archive. This
    goal functions the same as the jar goal but does not fork the build and is
    suitable for attaching to the build lifecycle.
  Implementation: org.apache.maven.plugins.source.SourceJarNoForkMojo
  Language: java
  Bound to phase: package

也就是说当用户配置使用maven-source-plugin:jar-no-fork目标的时候,如果不指定phase参数,该目标就会被绑定到package阶段。

 

 

 

在描述插件的时候,还可以省去版本信息,让Maven自动获取最新版本来进行表述,例如:
$ mvn help:describe -Dplugin=org.apache.maven.plugins:maven-compiler-plugin
进一步简化,可以使用插件目标前缀替换坐标:
$ mvn help:describe -Dplugin=compiler
如果想仅仅描述某个插件目标的信息,可以加上goal参数:
$ mvn help:describe -Dplugin=compiler -Dgoal=compile
如果想让maven-help-plugin输出更详细的信息,可以加上detail参数:
$ mvn help:describe -Dplugin=compiler -Ddetail

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值