• Maven Plugins And SpringBoot Package (一)


    一 简介

    1.定义

    所谓程序:简单解释就是可以被计算机理解和执行的一组语义符号,我们按照不同语言规范编写代码,形成有特定逻辑的功能块;编译就是将不同语言写的代码转换为对应的虚拟机语言并记录在文件上,对应的虚拟机可以解释运行文件上记录的符号信息,也即人类、符号、机器。

    Maven 官网

    什么是打包:将程序源代码编译,并与资源文件一起压缩为可被编译器识别并执行的文件包
    什么是插件:Maven 框架下,用于将源码编译、源文件压缩的程序
    

    官网说明

    在这里插入图片描述

    2.用途

    对于 Java 项目,可编译为如下包

    格式说明规模
    Jar(Java Archive file)Java代码包,一般为纯Java程序,但也可包含某些资源文件
    War(Web Archive file)可以理解为JavaWeb包,包含 Html、Jsp 文件
    Ear(Enterprise Archive file)企业级应用程序,内部可能含多个 Jar 程序

    二 手写 Maven 插件

    1.定义插件

    1.结构

    在这里插入图片描述

    2.依赖

    基于 Maven 框架手写插件,自定义一些源代码处理功能;引入两个插件依赖,同时注意代码编译为插件,即 packaging 的配置

    
    <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.0modelVersion>
    
        <groupId>com.demogroupId>
        <artifactId>my-pluginartifactId>
        <version>1.0-SNAPSHOTversion>
        <packaging>maven-pluginpackaging>
    
        <properties>
            <maven.compiler.source>8maven.compiler.source>
            <maven.compiler.target>8maven.compiler.target>
            <project.build.sourceEncoding>UTF-8project.build.sourceEncoding>
        properties>
    
        <dependencies>
    
            
            <dependency>
                <groupId>org.apache.mavengroupId>
                <artifactId>maven-plugin-apiartifactId>
                <version>3.8.6version>
            dependency>
            <dependency>
                <groupId>org.apache.maven.plugin-toolsgroupId>
                <artifactId>maven-plugin-annotationsartifactId>
                <version>3.6.4version>
            dependency>
    
            
    
        dependencies>
    project>
    

    3.编码

    此处绑定了一个默认阶段(概念后面介绍):defaultPhase = LifecyclePhase.PACKAGE

    package com.demo;
    
    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.util.Arrays;
    
    /**
     * @description 继承AbstractMojo
     * @author zhx
     * @date 2022-09-22 23:41
     * @since 1.8
     */
    @Mojo(name = "myPlugin",defaultPhase = LifecyclePhase.PACKAGE)
    public class MyPlugin extends AbstractMojo {
    
        /**
         * 定义了一个参数,名为 name
         */
        @Parameter(defaultValue = "my-plugin")
        private String name;
    
        /**
         * 定义了一个参数,名为 includes 使用插件时指定要包含哪些依赖
         */
        @Parameter
        private String[] includes;
    
        /**
         * 定义了一个参数,名为 excludes 使用插件时指定要排除哪些依赖
         */
        @Parameter
        private String[] excludes;
    
        /**
         * 定义了一个参数,名为 outPath 输出目录
         * property 可以通过 -DoutPath=/temp 指定目录
         */
        @Parameter(defaultValue = "${project.build.finalName}",property = "outPath")
        private String outPath;
    
        /**
         * 执行
         * @throws MojoExecutionException
         * @throws MojoFailureException
         */
        @Override
        public void execute() throws MojoExecutionException, MojoFailureException {
    
            System.out.println("jar name : " + name);
    
            //拷贝依赖包
            if(null!=includes){
                System.out.println("import depend jar");
                System.out.println(Arrays.asList(includes));
            }
    
            //剔除排除包
            if (null!=excludes){
                System.out.println("excludes:" + Arrays.asList(excludes));
            }
    
            //输出到
            System.out.println("OutPut Path:" + outPath);
    
        }
    }
    
    

    2.新建项目

    1.项目结构

    在这里插入图片描述

    2.配置插件

    
    <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.0modelVersion>
    
        <groupId>com.demogroupId>
        <artifactId>test-pluginartifactId>
        <version>1.0-SNAPSHOTversion>
    
        <properties>
            <maven.compiler.source>8maven.compiler.source>
            <maven.compiler.target>8maven.compiler.target>
            <project.build.sourceEncoding>UTF-8project.build.sourceEncoding>
        properties>
    
        <build>
    
            <plugins>
                <plugin>
                    <groupId>com.demogroupId>
                    <artifactId>my-pluginartifactId>
                    <version>1.0-SNAPSHOTversion>
                    <executions>
                        <execution>
                            <goals>
                                <goal>myPlugingoal>
                            goals>
                        execution>
                    executions>
                    <configuration>
                        <name>test-pluginname>
                    configuration>
                plugin>
    
            plugins>
        build>
    project>
    

    3.测试插件

    1.命令行

    Maven 会默认截取原名称第一个特殊字符前的内容作为插件名

     # 名称为 Pom 配置信息,路径为默认信息
     mvn my:myPlugin
    

    在这里插入图片描述

    # 指定输出路径
     mvn my:myPlugin -DoutPath=/temp
    

    在这里插入图片描述

    2.Idea编译

    可以在 configuration 标签下增加包含、排除配置

    在这里插入图片描述

    三 Maven 插件的实现

    1.生命周期和阶段

    Maven 编译分为三个生命周期,每个周期内包含不同阶段;简而言之就是分步进行清理、打包、发布的操作

    在这里插入图片描述

    阶段说明
    pre-clean清理前准备
    clean清理
    post-clean清理后处理
    validate校验
    initialize初始化
    generate-sources生成源码(如Maven的模型生成器:Modello)
    process-sources预编译(处理)源码
    generate-resources生成源文件
    process-resources将源文件拷贝到 ClassPath 对应目录
    compile编译
    process-classes处理编译生成的文件(如 Class 字节码优化)
    generate-test-sources生成包含在编译阶段的全部测试源码
    process-test-sources预编译(处理)测试源码
    generate-test-resources生成测试资源文件
    process-test-resources处理测试资源文件(复制到目标目录)
    test-compile编译测试源码输出到目标目录
    process-test-classes处理测试编译生成的文件
    test测试(测试单元框架,如:Junit)
    prepare-package打包前准备(创建目录等…)
    package打包(将所有文件压缩为Jar、War或Ear格式)
    pre-integration-test集成测试前准备
    integration-test集成测试
    post-integration-test集成测试后处理
    verify验证包完整和有效性
    install将包安装到本地仓库,使其他项目可依赖到当前包
    deploy将包发布到远程仓库,使包被网络内成员共享
    pre-site生成站点前准备
    site生成站点文档
    post-site生成站点后处理
    site-deploy发布站点到服务器

    Idea 默认插件功能

    在这里插入图片描述

    官网查看 Jar 包编译源码

    在这里插入图片描述

    2.Pom 配置说明

    不同 Lifecycle 可以包含相同 Phases,不同 Phases 可以包含 相同 Goals,逐层包裹;Goal即为配置的最小任务单元

    1.Goal 配置

    在手写插件新增一个Goal

    package com.demo;
    
    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;
    
    /**
     * @description 继承AbstractMojo
     * @author zhx
     * @date 2022-09-22 23:41
     * @since 1.8
     */
    @Mojo(name = "youPlugin",defaultPhase = LifecyclePhase.PACKAGE)
    public class YouPlugin extends AbstractMojo {
    
        /**
         * 定义了一个参数,名为 name
         */
        @Parameter(defaultValue = "you-plugin")
        private String name;
    
    
        /**
         * 执行
         * @throws MojoExecutionException
         * @throws MojoFailureException
         */
        @Override
        public void execute() throws MojoExecutionException, MojoFailureException {
    
            System.out.println("You Jar name : " + name);
    
        }
    }
    
    

    当我们测试项目不配置 executions 时,则打包不会执行任何 Goal
    在这里插入图片描述

    配置了 Goal 则按照配置的顺序执行

    在这里插入图片描述

    3.其他

    不同插件,可以配置executions、filters、configuration等参数,可以根据我们所要编译的包来配置,如执行、包含、排除、输出、名称等等信息

  • 相关阅读:
    [JavaEE系列] 多线程常见的锁策略及synchronized底层工作过程
    记录 22.9.25 第312场周赛1~3
    深度学习21天——卷积神经网络(CNN):服装图像分类(第3天)
    Python3.9标准库math中的函数汇总介绍(53个函数和5个常数)
    Nacos安装指南以及集群搭建
    Python机器学习项目开发实战:如何进行语音识别
    Flask 设置,获取,删除cookie 和 requests cookie 关联接口
    PHP比较漏洞, 代码审计, 字符串数字, “0e“字符串, 布尔值比较, 极限值, switch比较, in_array比较
    论文网站有哪些?
    uniapp小程序实现上下固定中间滑动布局(附源码和实现过程讲解)
  • 原文地址:https://blog.csdn.net/weixin_42176639/article/details/127098843