zoukankan      html  css  js  c++  java
  • 面试官:开发过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="http://maven.apache.org/POM/4.0.0"
             xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
             xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://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,后续我都会持续更新和维护,感谢大家长期以来对冰河的支持!!

  • 相关阅读:
    HTTP状态码
    MySQL的order by时区分大小写
    CopyOnWriteArrayList、CopyOnWriteArraySet、ConcurrentHashMap的实现原理和适用场景
    Map接口
    Python中创建守护进程
    df说磁盘空间满了, du说没有,到底谁是对的
    几种分布式文件系统对比
    Unity:控制粒子特效的移动方向
    创建NuGet包
    NuGet的简单使用
  • 原文地址:https://www.cnblogs.com/binghe001/p/13766972.html
Copyright © 2011-2022 走看看