首页 > 其他分享 >Maven 打包插件 maven-jar-plugin

Maven 打包插件 maven-jar-plugin

时间:2023-12-25 21:13:08浏览次数:36  
标签:插件 依赖 plugin Jar jar maven


转载自:https://blog.csdn.net/Ares5kong/article/details/128777500

文章目录

 

本文是对 maven-jar-plugin 常用配置的介绍,更详细的学习请参照 Apache Maven JAR Plugin 官方文档

这是 maven 生命周期 package 阶段的默认打包插件,当不想对该插件进行自定义配置时,就不用在 pom.xml 中主动声明该插件。通常主动声明的插件想与生命周期绑定时需要进行一些配置,但这个插件不需要,其默认绑定 package 阶段

该插件不会将项目中引入的依赖打进最终的 Jar 文件


指定版本

当想指定 maven-jar-plugin 的版本时,就必须在 pom.xml 中主动声明该插件:

<build>
    <plugins>
	    <!-- 主动声明插件 -->
        <plugin>    	
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-jar-plugin</artifactId>
            <version>3.1.2</version>
        </plugin>
    </plugins>
</build>
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

生成可执行 Jar

想通过 java -jar 命令运行 Jar 文件,就必须在 Jar 文件内的 META-INF\MANIFEST.MF 中指定入口类

通过 maven-jar-plugin 的默认配置生成 Jar 文件,其 META-INF\MANIFEST.MF 的内容为:

Manifest-Version: 1.0
Build-Jdk-Spec: 1.8
Created-By: Maven Archiver 3.4.0
 
  • 1
  • 2
  • 3

通过上面内容可以看到,maven-jar-plugin 的默认配置生成的 Jar 文件,其 META-INF\MANIFEST.MF 中是没有入口类的,所以无法直接运行,这种 Jar 文件的使用场景一般都是当作工具包让其他项目引用

如果想生成可执行的 Jar 文件,就必须在 pom.xml 中指明入口类,假设入口类是 App.java,那么配置如下:

<build>
    <plugins>
	    <!-- 主动声明插件 -->
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-jar-plugin</artifactId>
            <version>3.1.2</version>
            <!-- 对插件进行个性化配置 -->
            <configuration>
                <archive>
                    <manifest>
                        <!-- 将入口类添加到 MANIFEST.MF 中 -->
                        <mainClass>com.ares5k.App</mainClass>
                    </manifest>
                </archive>
            </configuration>
        </plugin>
    </plugins>
</build>
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19

通过 mvn package 运行上面配置后,生成的 MANIFEST.MF 中多了入口类信息,内容如下:

Manifest-Version: 1.0
Build-Jdk-Spec: 1.8
Created-By: Maven Archiver 3.4.0
Main-Class: com.ares5k.App
 
  • 1
  • 2
  • 3
  • 4

准备依赖,并指定依赖位置

文章最开始已经说过,通过 maven-jar-plugin 生成 Jar 文件时,不会将依赖包函进去

当项目中使用依赖时,如果想让最终生成的 Jar 文件可以成功运行,就需要我们提前准备好所有依赖的 Jar 文件,并放到一个固定的位置,然后在配置 maven-jar-plugin 时,指定依赖的位置,这样,当生成的 Jar 文件运行时就会到我们指定的位置中找依赖

示例,假设项目中依赖了 commons-lang3

1. 假设未来项目部署目录结构如下:

部署结构

2.假设 app 存放我们生成的 Jar 文件:

生成的Jar文件

3. 假设 lib 存放我们提前准备好的项目依赖的 Jar 文件:

依赖路径

4. 基于以上设想的未来目录结构,我们可以进行如下配置,注意,配置依赖的存放路径时,要以生成的 Jar 文件的最终存放目录(app 目录)为参照点,以相对路径的方式指定依赖的存放目录(lib 目录),这样配置后,在 app 目录下通过 java -jar 文件名 就可以正确运行程序:

<dependencies>
    <!-- 依赖 commons-lang3 -->
    <dependency>
        <groupId>org.apache.commons</groupId>
        <artifactId>commons-lang3</artifactId>
        <version>3.12.0</version>
    </dependency>
</dependencies>

<build>
    <plugins>
        <plugin>
            <!-- 主动声明插件 -->
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-jar-plugin</artifactId>
            <version>3.1.2</version>
            <!-- 对插件进行个性化配置 -->
            <configuration>
                <archive>
                    <manifest>
                        <!-- 将入口类添加到 MANIFEST.MF 中 -->
                        <mainClass>com.ares5k.App</mainClass>
                        <!-- 将项目的依赖信息添加到 MANIFEST.MF 中 -->
                        <addClasspath>true</addClasspath>
                        <!-- 将依赖的存放位置添加到 MANIFEST.MF 中-->
                        <classpathPrefix>../lib/</classpathPrefix>
                    </manifest>
                </archive>
            </configuration>
        </plugin>
    </plugins>
</build>
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32

5. 上述配置生成的 MANIFEST.MF 中多了依赖的信息:

Manifest-Version: 1.0
Class-Path: ../lib/commons-lang3-3.12.0.jar
Build-Jdk-Spec: 1.8
Created-By: Maven Archiver 3.4.0
Main-Class: com.ares5k.App
 
  • 1
  • 2
  • 3
  • 4
  • 5

自动下载依赖的 Jar 文件

当项目中依赖比较多时,自己准备依赖 Jar 文件就很繁琐,我们可以借助 maven-dependency-plugin 插件自动帮我们下载依赖的 Jar 文件,推荐将该插件绑定到生命周期上,如下:

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-dependency-plugin</artifactId>
    <executions>
        <execution>
	        <!-- 绑定生命周期 -->
            <phase>package</phase>
            <goals>
                <goal>copy-dependencies</goal>
            </goals>
            <!-- 设置依赖的存放路径 -->
            <configuration>
                <outputDirectory>${project.build.directory}/lib</outputDirectory>
            </configuration>
        </execution>
    </executions>
</plugin>
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17

上面的配置在执行 mvn package 后就会自动把我们的依赖文件下载下来,不再需要自己一个个的准备了


打包时排除文件

排除文件时可以直接指定文件名,也可以通过通配符的方式排除所有满足规则的文件,设置排除文件路径时要以${project.build.outputDirectory} 为基准,默认是在 target/classes

<plugins>
    <plugin>
        <!-- 主动声明插件 -->
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-jar-plugin</artifactId>
        <version>3.1.2</version>
        <!-- 对插件进行个性化配置 -->
        <configuration>
            <!-- 不想包函到 Jar 中的文件 -->
            <excludes>
                <!-- 直接指明要排除的文件 -->
                <exclude>com/ares5k/App.class</exclude>
                <exclude>env.properties</exclude>
                <!-- 用通配符指定要排除的文件 -->
                <exclude>com/ares5k/App.*</exclude>
                <exclude>*.*</exclude>
            </excludes>
        </configuration>
    </plugin>
</plugins>
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20

与其他常用打包插件比较

除了 Maven 默认的 maven-jar-plugin 之外,常用的打包插件还有 maven-shade-pluginspring-boot-maven-plugin,使用方法在我其他文章中也有记录,在此将它们作一个简单的比较

maven-jar-plugin

maven 生命周期中 package 阶段的默认插件,不管是否在 pom.xml 中主动声明,也不管是否有其他的 package 阶段插件被绑定,其在 package 阶段都会被最先执行

使用 maven-jar-plugin 打包时,不会将依赖的 Jar 包添加到生成的项目 Jar 包中,所以当项目中使用依赖时,需要自己准备依赖的 Jar 包,这样 maven-jar-plugin 打出的项目 Jar 包才能被成功运行

spring-boot-maven-plugin

spring-boot-maven-plugin 是 Spring 提供的一个 Maven 打包插件,可以通过 maven 的插件命令运行,但是一般习惯将它与 maven 生命周期绑定,然后通过 maven 生命周期命令运行,它的特点是可以将项目中依赖的 Jar 包添加到最终生成的项目 Jar 包中

spring-boot-maven-plugin 主要是对 maven-jar-plugin 生成的项目 Jar 包进行二次打包,并将项目依赖的 Jar 包添加进项目的 Jar 包中

maven-shade-plugin

maven-shade-plugin 也可以将项目的依赖打进最终的项目 Jar 包中,但是其与 spring-boot-maven-plugin 不同的是,spring-boot-maven-plugin 是直接将依赖的 Jar 包放进项目的 Jar 包中,而 maven-shade-plugin 则是将依赖的 Jar 包解压,然后将解压后的文件放进最终的项目 Jar 包中

maven-shade-plugin 将依赖的 Jar 包解压后添加到项目的 Jar 包中的做法,为 maven-shade-plugin 带来了另一个重要的功能 <重命名>,因为将依赖的 Jar 包解压后都是以文件形式存在,所以 maven-shade-plugin 支持对对依赖的某个具体文件进行重命名,maven-shade-plugin 在重命名时,不只是将文件名字修改,连我们项目中对其引用的地方都会一同修改

重命名的做法可以避免版本冲突,想详细了解的可以参考我 maven-shade-plugin 的文章

标签:插件,依赖,plugin,Jar,jar,maven
From: https://www.cnblogs.com/wanghengbin/p/17926979.html

相关文章

  • WPF Halcon机器视觉和运动控制软件通用框架,插件式开发,开箱即用 仅供学习!
    点我下载,仅供个人学习使用参考easyvision开发,集成几十个软件算子此版本以添加ui设计器。具体功能如上所示,可以自定义变量,写c#脚本,自定义流程,包含了halcon脚本和封装的算子,可自定义ui,通过插件形式开发很方便拓展自己的功能。......
  • 一些好用的maven插件介绍
     一些好用的maven插件介绍转载自:https://juejin.cn/post/7231527422200692794Maven插件是扩展Maven功能的方式之一,它可以帮助我们更轻松地管理依赖性、构建应用程序、运行测试和部署应用程序等。maven插件实在是太多了,我这里也介绍不完,仅仅以我使用过的也比较实用的给大家......
  • 这款IDEA插件用着确实爽
    IDEA是一款功能强大的集成开发环境(IDE),它可以帮助开发人员更加高效地编写、调试和部署软件应用程序。我们在编写完接口代码后需要进行接口调试等操作,一般需要打开额外的调试工具。今天给大家介绍一款IDEA插件:Apipost-Helper-2.0。代码写完直接编辑器内调试、还支持生成接口文档、......
  • 免费IDEA插件推荐-Apipost-Helper
    IDEA插件市场中的API调试插件不是收费(FastRequest)就是不好用(apidoc、apidocx等等)今天给大家介绍一款国产的API调试插件:Apipost-Helper,完全免费且好看好用!这款插件由Apipost团队开发的,其官方介绍是:用于IDEA项目快速生成API文档,快速查询接口、接口代码功能,并支持在IDEA中进行API......
  • 不使用第三方插件自己写一个数字递增滚动组件
    开箱即用水贴专用哈哈哈封装NumberRoller.vue组件<template><div><span:style="fontColorSize">{{formattedValue||0}}</span></div></template><script>exportdefault{props:{rollNumber:{//......
  • 手写滑动同步滚动进度条jq插件
    因需要一种滑动显示内容,并且带可拖动的进度条,即下面这种效果 找了很多插件,总有地方不能满足需求。于是决定自己手写,下面为完整源码:swiper.js1$.swiperCalculator=function(wrap,drag){2this.wrap=wrap;3this.drag=drag;4this.dWidth=drag......
  • Cost Calculator Builder PRO v3.1.46 已注册 – WordPress 插件
    成本计算器生成器PROv3.1.46:WordPress插件全解析一、插件概述"成本计算器生成器PROv3.1.46"是一款强大的WordPress插件,专为需要创建报价、价格和项目估算表的用户设计。这款插件集成了众多高级功能,可帮助用户高效地管理他们的成本和价格,从而提供准确的报价估算。二、条......
  • Taurus .Net Core 微服务开源框架:Admin 插件【4-5】 - 配置管理-Mvc【Plugin-Admin 后
    前言:继上篇:Taurus.NetCore微服务开源框架:Admin插件【4-4】-配置管理-Mvc【Plugin-CORS跨域】本篇继续介绍下一个内容:系统配置节点:Mvc- Plugin- Admin 后台界面:配置界面如下: 配置说明如下:1、Admin.IsEnable:配置当前后台插件是否可用这是个很危险的开关:如果......
  • 强大的VS插件CodeRush全新发布v23.2——支持并发.NET类型
    CodeRush是一个强大的VisualStudio.NET插件,它利用整合技术,通过促进开发者和团队效率来提升开发者体验。CodeRush能帮助你以极高的效率创建和维护源代码。Consume-first申明,强大的模板,智能的选择工具,智能代码分析和创新的导航以及一个无与伦比的重构集,在它们的帮助下能够大大的......
  • 《安富莱嵌入式周报》第329期:圣诞前夕,各种软件井喷式更新,开源600Wh的UPS低压电源,各种
    周报汇总地址:http://www.armbbs.cn/forum.php?mod=forumdisplay&fid=12&filter=typeid&typeid=104 圣诞前夕,各种软件井喷式发布新版本视频版:https://www.bilibili.com/video/BV19Q4y1u7Es 1、开源600Wh的UPS低压电源https://pop.fsck.pl/projects/secondlife-ups-Mk......