maven-jar-plugin maven打包插件笔记

文章目录

maven自定义插件内容很多,也不易理解,这里把maven打包插件单拿出来,作为入口试着理解下。

配置示例

xml 复制代码
<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-jar-plugin</artifactId>
    <version>3.2.2</version>
    <configuration>
        <!--要使用的打包配置.-->
        <archive>
            <!-- 创建的归档文件是否包含以下pom.xml 和pom.properties Maven 文件,默认是true -->
            <addMavenDescriptor>true</addMavenDescriptor>
            <!-- 生成MANIFEST.MF的设置 -->
            <manifest>
                <!-- 为依赖包添加路径, 这些路径会写在MANIFEST文件的Class-Path下 -->
                <addClasspath>true</addClasspath>
                <!-- 这个jar所依赖的jar包添加classPath的时候的前缀,如果这个jar本身和依赖包在同一级目录,则不需要添加 -->
                <classpathPrefix>lib/</classpathPrefix>
                <!-- jar启动入口类 -->
                <mainClass>com.example.demo.DemoApplication</mainClass>
            </manifest>
            <manifestEntries>
                <!-- 在Class-Path下添加配置文件的路径 -->
                <!--<Class-Path>../config/</Class-Path>-->
            </manifestEntries>
        </archive>
        <!-- jar包的位置,其中${project.build.directory}默认为 target/ -->
        <outputDirectory>${project.build.directory}</outputDirectory>
        <!--过滤掉不希望包含在jar中的文件-->
        <excludes>
            <exclude>${project.basedir}/xml/*</exclude>
        </excludes>
        <!--要包含的文件列表-->
        <includes>
            <!-- 打jar包时,打包class文件和config目录下面的 properties文件 -->
            <!-- 有时候可能需要一些其他文件,这边可以配置,包括剔除的文件等等 -->
            <include>**/*.class</include>
            <include>**/*.properties</include>
        </includes>
    </configuration>
</plugin>

如上标签就是打包插件自定义的。其他的如等都是maven基础标签。

所有标签中的内容,都是用@Parameter注入的,如果必填,加上 required = true。

java 复制代码
@Parameter(defaultValue = "${project.build.outputDirectory}", required = true)
    private File classesDirectory;

其他

官网文档

apache打包插件官网地址:

https://maven.apache.org/plugins/maven-jar-plugin/jar-mojo.html

github地址:

https://github.com/apache/maven-jar-plugin.git

问题

maven打包插件是如何和打包动作关联在一起的?

创建类的时候就定义了。 defaultPhase = LifecyclePhase.PACKAGE 这一行就是。

java 复制代码
@Mojo(
        name = "jar",
        defaultPhase = LifecyclePhase.PACKAGE,
        requiresProject = true,
        threadSafe = true,
        requiresDependencyResolution = ResolutionScope.RUNTIME)
public class JarMojo extends AbstractJarMojo {}

配置文件中 goal是必须的吗?

想要解答这个问题,先要知道控制执行有几种方式。

两种:

1、 @Mojo注解中defaultPhase设置默认phase(阶段)。

2、配置文件中指定。

如:

xml 复制代码
<plugin>
   <groupId>com.example</groupId>
    <artifactId>my-plugin</artifactId>
    <version>1.0.0</version>
    <executions>
        <!-- 在compile阶段执行插件的goal-1目标 -->
        <execution>
            <id>execution-1</id>
            <phase>compile</phase>
            <goals>
                <goal>goal-1</goal>
            </goals>
        </execution>
        <!-- 在install阶段执行插件的goal-2和goal-3目标 -->
        <execution>
            <id>execution-2</id>
            <phase>install</phase>
            <goals>
                <goal>goal-2</goal>
                <goal>goal-3</goal>
            </goals>
        </execution>
    </executions>
</plugin>

这样也实现了goal和phase的绑定。

那么另外一个问题也迎刃而解,maven自定义插件可以有多个goal(mojo)吗?

当然可以,参考maven-install-plugin,有两个mojo:install和install-file。

相关推荐
尤乐娃子12 小时前
进入大厂(厂子大)实习Day12
前端·笔记·实习
砚凝霜14 小时前
软考网络工程师|第 6 章 密码学、哈希、数字签名、数字证书 PKI 完整备考笔记
笔记·密码学·哈希算法
QAQo7T14 小时前
Python组蓝桥杯备赛超详细知识点总结笔记_排序算法篇
笔记·python·算法·蓝桥杯·排序算法
lion_heart00114 小时前
成功日记Plus 智能记账:共享账本、预算管控、Excel 导出等一次讲清
笔记
智者知已应修善业17 小时前
【三位数字显示计时定时器设计-同步方式】2025-6-30
驱动开发·经验分享·笔记·硬件架构·硬件工程
影寂ldy17 小时前
SQL 事务(Transaction)完整版学习笔记(含转账案例+存储过程+异常捕获)
笔记·sql·学习
风曦Kisaki19 小时前
# Kubernetes(K8s)笔记Day12 :K8s 七层代理(Ingress 和 Ingress Controller)
linux·笔记·云原生·容器·kubernetes
雪之下雪乃的代码日记19 小时前
Python快速入门(Java开发者版)
java·开发语言·笔记·python
zzh___zzh20 小时前
Java Stream API 常用方法笔记
java·笔记
zzm62820 小时前
安全嵌套子博弈求解与非完美信息博弈——NIPS 2017 最佳论文阅读笔记
论文阅读·笔记·nips·博弈论