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

扫码关注公众号:Java 技术驿站

发送:vip
将链接复制到本浏览器,永久解锁本站全部文章

【公众号:Java 技术驿站】 【加作者微信交流技术,拉技术群】
免费领取10G资料包与项目实战视频资料

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

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

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

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

202001103006\_1.png

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

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

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

生命周期阶段 插件目标

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

生命周期阶段 插件目标

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

生命周期阶段 插件目标 执行任务

自定义绑定:除了内置绑定以外,用户还能够自己选择将某个插件目标绑定到生命周期的某个阶段上,一个常见的例子是创建项目的源码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
赞(0) 打赏
版权归原创作者所有,任何形式的转载请联系博主:daming_90:Java 技术驿站 » 【maven实战】16-插件目标与插件绑定

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

微信扫一扫打赏