所谓程序:简单解释就是可以被计算机理解和执行的一组语义符号,我们按照不同语言规范编写代码,形成有特定逻辑的功能块;编译就是将不同语言写的代码转换为对应的虚拟机语言并记录在文件上,对应的虚拟机可以解释运行文件上记录的符号信息,也即人类、符号、机器。
什么是打包:将程序源代码编译,并与资源文件一起压缩为可被编译器识别并执行的文件包
什么是插件:Maven 框架下,用于将源码编译、源文件压缩的程序
官网说明

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

基于 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>
此处绑定了一个默认阶段(概念后面介绍):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);
}
}

<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>
Maven 会默认截取原名称第一个特殊字符前的内容作为插件名
# 名称为 Pom 配置信息,路径为默认信息
mvn my:myPlugin

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

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

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 包编译源码

不同 Lifecycle 可以包含相同 Phases,不同 Phases 可以包含 相同 Goals,逐层包裹;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 则按照配置的顺序执行

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