第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

Maven 編寫(xiě)插件

這一節(jié)我們來(lái)講如何編寫(xiě) Maven 的插件。在生命周期一節(jié)中,我們了解到一個(gè)插件通常是包含多個(gè)目標(biāo)的,而不同的目標(biāo)也就對(duì)應(yīng)了生命周期中的不同階段。在之前的章節(jié)中,我們著重介紹如何使用 Maven 的插件,那么在本節(jié)中,我們來(lái)介紹如何自定義一個(gè)插件。其實(shí)通常情況下,我們是不需要自己定制插件的,因?yàn)?Maven 有太多可以配置的插件供開(kāi)發(fā)者來(lái)使用的,所以,除非一個(gè)開(kāi)發(fā)者發(fā)現(xiàn)自己有非常特殊的需求,而這個(gè)需求并不能通過(guò)現(xiàn)有的插件來(lái)完成的時(shí)候,才需要自定義一個(gè) Maven 插件了。

圖片描述

1. 什么是插件

在編寫(xiě)插件之前,我們先來(lái)看看什么是 Maven 插件。

1.1 控制反轉(zhuǎn)

類似于 Spring 框架的 Ioc 容器,Maven 也沿用了這種做法,將其中與生命周期進(jìn)行綁定的 Mojo Bean 進(jìn)行托管,將對(duì)象的創(chuàng)建和控制權(quán)交與 Ioc 容器來(lái)進(jìn)行管理。在 Ioc 容器中比較重要的一個(gè)概念就是依賴注入,在 Maven 編程的時(shí)候,會(huì)使用到兩種依賴注入方式:

  • 構(gòu)造器注入: 即在對(duì)象被創(chuàng)建的時(shí)候,通過(guò)構(gòu)造器參數(shù),將對(duì)象的值傳入并賦值;
  • set 方法注入: 即通過(guò)對(duì)象屬性的 set 方法來(lái)為對(duì)象的屬性賦值。

總的來(lái)講,在 Maven 中實(shí)現(xiàn)的 Ioc 容器和 Spring 中的 Ioc 容器是非常類似的。

1.2 Mojo

通常情況下,Maven 插件包括不同的目標(biāo),而這些目標(biāo)則是通過(guò) Mojo 來(lái)實(shí)現(xiàn)的。Mojo 可以對(duì)標(biāo) Java 中的 Pojo,這樣理解起來(lái)就會(huì)很方便。而這些 Mojo 對(duì)象則是被 Maven 中的 Ioc 容器進(jìn)行管理的。

例如, install:install 目標(biāo)對(duì)應(yīng) Maven Install 插件中的 InstallMojo 的 Java 類。而 deploy:deploy目標(biāo)則對(duì)應(yīng) Maven Deploy 插件中的 DeployMojo 的 Java 類。

1.3 插件描述符

在 Maven 插件的 JAR 文件中,有一個(gè) META-INF/maven/plugin.xml 配置文件,這個(gè)文件描述了這個(gè)插件中的各個(gè) Mojo 對(duì)象與其他的插件配置(我們可以在本地倉(cāng)庫(kù)中找到任何一個(gè)插件,來(lái)查看該插件的 plugin.xml 文件)。當(dāng)一個(gè)插件的被添加到依賴中的時(shí)候,Maven 會(huì)首先去讀取這個(gè)文件,來(lái)對(duì)該插件進(jìn)行初始化。通常,這個(gè)文件并不需要我們自己來(lái)編寫(xiě),而是在生成插件的時(shí)候,Maven 會(huì)幫我們來(lái)完成。

2. 編寫(xiě)插件

2.1 編寫(xiě)插件的主要步驟

  1. 創(chuàng)建 maven-plugin 項(xiàng)目: 其實(shí)也是創(chuàng)建一個(gè) Maven 項(xiàng)目,只不過(guò) pom.xml 文件中的 packaging 必須為 maven-plugin;
  2. 編寫(xiě)插件目標(biāo): 通常情況下,一個(gè)插件會(huì)有一個(gè)或者多個(gè)目標(biāo),即一個(gè)或者多個(gè) Mojo 。而這個(gè) Mojo 類必須要繼承 AbstractMojo 類;
  3. 為目標(biāo)提供配置點(diǎn): 通常情況下 Maven 插件的目標(biāo)都是可配置的,所以我們?cè)诰帉?xiě)插件的時(shí)候,也盡量需要提供可配置的參數(shù);
  4. 實(shí)現(xiàn)目標(biāo)行為: 一個(gè)繼承了 AbstractMojo 的 Mojo 類,需要實(shí)現(xiàn)其中的 excute 方法,這個(gè)方法即是插件目標(biāo)要做的事情;
  5. 記錄日志并處理異常: 如同編寫(xiě)其他的程序一樣,編寫(xiě)插件的時(shí)候,也需要通過(guò)記錄日志的方式來(lái)記錄插件的運(yùn)行狀態(tài);
  6. 測(cè)試并運(yùn)行插件: 插件編寫(xiě)完成后,我們要對(duì)插件進(jìn)行簡(jiǎn)單的測(cè)試,并通過(guò)實(shí)際運(yùn)行插件的方式來(lái)驗(yàn)證插件是否能夠滿足我們的要求。

從上面的步驟來(lái)看,其實(shí)編寫(xiě)插件也就相當(dāng)于編寫(xiě)一個(gè)小型的項(xiàng)目,從創(chuàng)建項(xiàng)目到開(kāi)發(fā),測(cè)試再到上線發(fā)布,每一個(gè)步驟都需要經(jīng)過(guò)。

2.2 編寫(xiě)插件案例

那接下來(lái),我們就實(shí)際編寫(xiě)一個(gè)小插件來(lái)進(jìn)行演示。

首先,我們?cè)诖娣糯a的目錄下執(zhí)行命令 mvn archetype:generate (在 idea 中根據(jù) archetype 來(lái)創(chuàng)建項(xiàng)目,效果相同),選擇 maven-archetype-plugin 模板,然后依次按照提示輸入 groupId 和 artifactId 等等信息。

這里,我們?yōu)檫@個(gè)插件命名為 my-plugin,項(xiàng)目結(jié)構(gòu)如下:

接下來(lái),我們就創(chuàng)建一個(gè)自己的 Mojo 類,叫做 SumFileMojo,這個(gè)目標(biāo)用于統(tǒng)計(jì)當(dāng)前項(xiàng)目中有多少個(gè)Java 類。并且,我們將原本的 MyMojo 類刪掉。

package com.mic.tech;

import org.apache.maven.plugin.AbstractMojo;
import org.apache.maven.plugin.MojoExecutionException;
import org.apache.maven.plugin.MojoFailureException;
import org.apache.maven.plugins.annotations.LifecyclePhase;
import org.apache.maven.plugins.annotations.Mojo;
import org.apache.maven.plugins.annotations.Parameter;

import java.io.File;
import java.util.Objects;

/**
 * @Auther: Uncle Biao
 * @Date: 2020/6/9 23:37
 * @Description:
 */
@Mojo(name = "sumFileCount",defaultPhase= LifecyclePhase.COMPILE)
public class SumFileCountMojo extends AbstractMojo {

    @Parameter(property = "path")
    private String path;
    /**
     * java文件數(shù)量
     */
    int javaFileCount = 0;

    @Override
    public void execute() throws MojoExecutionException, MojoFailureException {
        System.out.println(countJavaFile(path));
    }

    public String countJavaFile(String path){
        File file = new File(path);
        if (file.exists()) {
            File [] files = file.listFiles();
            if(Objects.isNull(files)){
                for(int i=0 ; i < files.length ; i++){
                    File currentFile = files[i];
                    if(currentFile.isFile()){
                        String fileName = currentFile.getName();
                        String suffix = fileName.substring(fileName.lastIndexOf(".") + 1);
                        if("java".equals(suffix)){
                            javaFileCount ++;
                        }
                    }else{
                        countJavaFile(currentFile.getAbsolutePath());
                    }
                }
            }
        }
        return "number of Java File is " + javaFileCount;
    }
}

編碼完成后,我們執(zhí)行 mvn clean install 命令將插件構(gòu)建到本地倉(cāng)庫(kù)中去。

接下來(lái),我們可以在 mall 項(xiàng)目中加入該插件的依賴,并且為該插件配置執(zhí)行目標(biāo)。

<plugin>
    <groupId>com.mic.tech</groupId>
    <artifactId>my-plugin</artifactId>
    <version>1.0.0-SNAPSHOT</version>
    <configuration>
  	  <path>${project.basedir}</path>
    </configuration>
    <executions>
        <execution>
            <phase>compile</phase>
            <goals>
            	<goal>sumFileCount</goal>
            </goals>
        </execution>
    </executions>
</plugin>

依賴添加完成后,在 mall-order 模塊下執(zhí)行命令 mvn compile 便可以看到統(tǒng)計(jì)出來(lái) Java 文件的數(shù)量。

至此,我們編寫(xiě)了一個(gè)簡(jiǎn)單的插件,用于統(tǒng)計(jì)項(xiàng)目中 Java 文件的數(shù)量。

3. 小結(jié)

本節(jié)中,我們介紹了如何自定義一個(gè) Maven 插件,需要注意的地方,以及通常的編寫(xiě)步驟。最后,我們編寫(xiě)了一個(gè)用于統(tǒng)計(jì)項(xiàng)目中 Java 文件數(shù)量的插件。當(dāng) Maven 提供的插件不能滿足我們需求的時(shí)候,就可以嘗試去自定義一個(gè)簡(jiǎn)單插件來(lái)供自己使用。