面試官:開發過Maven插件嗎?我:開發過啊。。。

寫在前面

轉眼間,今天已經是假期的第4天了。今天要給大家分享點啥呢?想了半天,想起了之前去某寶面試的情景。記得面試前自己基於Maven開發過一些簡單實用的插件,而且在自己的本地環境中一直在使用,極大的提高了我的開發和工作效率。恰好在面試時,某寶的面試官問了我一個問題:開發過Maven插件嗎?我:開發過啊。面試官:那你給我講講你是如何開發的呢?我:吧啦吧啦吧啦。。。面試官:下周入職吧!我:好的。就這樣,我拿到了Offer。

Maven插件的相關概念

插件坐標定位

插件與普通jar包一樣包含坐標定位屬性即:groupId、artifactId、version,當使用該插件時會從本地倉庫中搜索,如果沒有則從遠程倉庫下載,例如下面的配置所示。

<!-- 唯一定位到dependency 插件 -->
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-dependency-plugin</artifactId>
<version>2.10</version>

execution配置

execution 配置包含一組指示插件如何執行的屬性:

  • id : 執行器命名
  • phase:標識執行的階段
  • goals:標識執行的目標或功能
  • configuration:標識執行目標所需的配置文件

插件的配置和使用示例

將插件依賴拷貝到指定目錄。

<plugin>
  <groupId>org.apache.maven.plugins</groupId>
  <artifactId>maven-dependency-plugin</artifactId>
  <version>3.1.1</version>
  <executions>
    <execution>
      <id>copy-dependencies</id>
      <phase>package</phase>
      <goals>
        <goal>copy-dependencies</goal>
      </goals>
      <configuration>       <outputDirectory>${project.build.directory}/alternateLocation</outputDirectory>
        <overWriteReleases>false</overWriteReleases>
        <overWriteSnapshots>true</overWriteSnapshots>
        <excludeTransitive>true</excludeTransitive>
      </configuration>
    </execution>
  </executions>
</plugin>

常用插件的使用

通過命令執行插件語法

除了通過配置的方式使用插件以外,Maven也提供了通過命令直接調用插件目標其命令格式如下所示。

mvn groupId:artifactId:version:goal -D{參數名}

通過命令執行插件示例

(2)展示pom的依賴關係樹

mvn org.apache.maven.plugins:maven-dependency-plugin:2.10:tree

(3)直接簡化版的命令,但前提必須是maven 官方插件

mvn dependency:tree

其它常用插件

(1)查看pom 文件的最終配置

mvn help:effective-pom

(2)原型項目生成

archetype:generate

(3)快速創建一個Web程序

mvn archetype:generate -DgroupId=io.mykit.web -DartifactId=mykit-maven-web -DarchetypeArtifactId=maven-archetype-webapp -DinteractiveMode=false

(4)快速創建一個Java項目

mvn archetype:generate -DgroupId=io.mykit.java -DartifactId=mykit-maven-java -DarchetypeArtifactId=maven-archetype-quickstart -DinteractiveMode=false

自定義Maven插件

這裡,我們先來說說自定義Maven插件的步驟,這裡,我將自定義Maven插件的步驟總結如下。

(1)創建maven 插件項目

(2)設定packaging 為maven-plugin

(3)添加插件依賴

(4)編寫插件實現邏輯

(5)打包構建插件

接下來,我們就來實現自定義Maven插件。

配置插件項目的pom.xml

這裡,我直接跳過了Maven項目的創建,相信小夥伴們都會創建Maven項目,這裡,我就不再贅述了,直接給出pom.xml文件的配置,如下所示。

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="//maven.apache.org/POM/4.0.0"
         xmlns:xsi="//www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="//maven.apache.org/POM/4.0.0 //maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <groupId>io.mykit.plugin</groupId>
    <version>1.0.0-SNAPSHOT</version>
    <artifactId>mykit-maven-plugin</artifactId>
    <packaging>maven-plugin</packaging>
    <dependencies>
        <dependency>
            <groupId>org.apache.maven</groupId>
            <artifactId>maven-plugin-api</artifactId>
            <version>3.5.0</version>
        </dependency>
        <dependency>
            <groupId>org.apache.maven.plugin-tools</groupId>
            <artifactId>maven-plugin-annotations</artifactId>
            <version>3.5</version>
        </dependency>
    </dependencies>
    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>3.6.1</version>
                <configuration>
                    <source>1.8 </source>
                    <target>1.8 </target>
                </configuration>
            </plugin>
        </plugins>
    </build>
</project>

Maven插件的實現類

接下來,我們來編寫Maven插件的實現類。這裡,我直接給出類的源代碼,如下所示。

package io.mykit.plugin; 

import javafx.beans.DefaultProperty;
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;

/**
 * @author binghe
 * @description 自定義Maven插件
 */
@Mojo(name = "binghe")
public class MykitMavenPlugin extends AbstractMojo {
    private final Logger logger = LoggerFactory.getLogger(MykitMavenPlugin.class);
    @Parameter(property="sex")
    String sex;

    @Parameter(property="describe")
    String describe;

    public void execute() throws MojoExecutionException, MojoFailureException {
        logger.info(String.format("binghe sex=%s describe=%s",sex,describe));
    }
}

打包安裝插件

將自定義的Maven插件打包並安裝到本地Maven倉庫,如下所示。

  • 打包
mvn clean package
  • 安裝到本地倉庫
mvn clean install

其他項目中引用自定義插件

如果需要在其他項目中使用我們自定義的Maven插件,則只需要創建一個Maven項目,在Maven項目的pom.xml文件中引入如下配置即可。

<build>
    <plugins>
        <plugin>
            <!--引入剛剛的插件依賴-->
             <groupId>io.mykit.plugin</groupId>
             <version>1.0.0-SNAPSHOT</version>
             <artifactId>mykit-maven-plugin</artifactId>
            <!-- 這裡加入的是相關參數,這些參數必須跟插件實現裏面的屬性保持一致 -->
            <configuration>
                <sex>男</sex>
                <describe>冰河技術微信公眾號作者</describe>
            </configuration>
        </plugin>
    </plugins>
</build>

重磅福利

微信搜一搜【冰河技術】微信公眾號,關注這個有深度的程序員,每天閱讀超硬核技術乾貨,公眾號內回復【PDF】有我準備的一線大廠面試資料和我原創的超硬核PDF技術文檔,以及我為大家精心準備的多套簡歷模板(不斷更新中),希望大家都能找到心儀的工作,學習是一條時而鬱鬱寡歡,時而開懷大笑的路,加油。如果你通過努力成功進入到了心儀的公司,一定不要懈怠放鬆,職場成長和新技術學習一樣,不進則退。如果有幸我們江湖再見!

另外,我開源的各個PDF,後續我都會持續更新和維護,感謝大家長期以來對冰河的支持!!