Maven 打包插件 maven-jar-plugin


文章目录

  • 指定版本
  • 生成可执行 Jar
  • 准备依赖,并指定依赖位置
    • 自动下载依赖的 Jar 文件
  • 打包时排除文件
  • 与其他常用打包插件比较

本文是对 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>

生成可执行 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

通过上面内容可以看到,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>

通过 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

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

文章最开始已经说过,通过 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>

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

自动下载依赖的 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>

上面的配置在执行 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>

与其他常用打包插件比较

除了 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 的文章

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://xiahunao.cn/news/352016.html

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

Linux系统中使用Xbox360手柄

最近一个项目中需要用到Xbox360游戏手柄&#xff0c;硬件平台为周立功A7开发板&#xff0c;EPC-6G2C-L&#xff0c;折腾半天&#xff0c;终于弄好了&#xff1b; 正常电脑Ubuntu系统是自带手柄驱动的&#xff0c;将手柄插上电脑USB接口&#xff0c;将自动出现设备接口文件&…

dll修复都有哪些方法?详细解析各种dll修复方法

DLL&#xff08;动态链接库&#xff09;是 Windows 操作系统中的一种重要文件&#xff0c;它包含了许多程序所需的函数和资源。因此&#xff0c;当 DLL 文件出现问题时&#xff0c;可能会导致程序无法正常运行&#xff0c;甚至整个系统崩溃。这时候需要使用 DLL 修复工具进行修…

ROS:常用可视化工具的使用

目录 一、日志输出工具——rqt_console二、绘制数据曲线——rqt_plot三、图像渲染工具——rqt_image_view四、图形界面总接口——rqt五、Rviz六、Gazebo 一、日志输出工具——rqt_console 启动海龟键盘控制节点&#xff0c;打开日志输出工具 roscorerosrun turtlesim turtles…

linux版drastic模拟器设置,DraStic nds模拟器下载安装及使用图文教程

近日&#xff0c;曾便携过PSP用GBA模拟器的开发者Exophase发布了一款安卓用的NDS模拟器《DraStic》&#xff0c;DraStic曾是Exophase为开源掌机潘多拉编写的一款功能强大的NDS模拟器&#xff0c;现在移植到了Android。 你会在下载到的Download文件夹内发现三个文件&#xff0c;…

【娇娘内核】完整解密

这个很好&#xff0c;一直想了解的&#xff0c;转之。原帖&#xff0c;感谢“华敏乐” &#xff0d;&#xff0d;&#xff0d;&#xff0d;&#xff0d;&#xff0d;&#xff0d;&#xff0d;&#xff0d;&#xff0d;&#xff0d;&#xff0d;&#xff0d;&#xff0d;&#…

《口袋妖怪 太阳/月亮》正式公布 简体中文确认

Pokmon(大陆通常意译为<口袋妖怪>, 港译为<寵物小精靈>,台译为<神奇寶貝>)系列作为任天堂平台的的招牌游戏之一, 自诞生20年以来在全球有非常多的玩家. 此前发布的版本内置了8国语言, 但是并没有中文.其实中国玩家也非常多, 所以经常拿"8国语言"来…

[转幺幺]硬件解码—NDS影音播放专家iPlayer卡评测

转&#xff1a;幺幺任天堂 前言&#xff1a;DS并不缺乏多媒体能力&#xff0c;虽然任天堂官方没有给它加入这些&#xff0c;但是通过自制软件&#xff0c;我们已经实现了用DS听音乐、看电子书、看视频等功能。看书看图听音乐这些功能已经比较完美了&#xff0c;而且支持的都是目…

自己动手丰衣足食-自己动手修改GBA ROM游戏文件

经过一天的努力终于琢磨出怎么修改GBA的游戏文件也就是俗称的ROM文件&#xff0c;起因是因为偶然看到二手GBM&#xff0c;顿时抑制不住买了一台&#xff0c;可惜买得晚了&#xff0c;完美运行游戏又带金手指功能的烧录卡买不到了。SUPERCARD烧录卡看评论说费电&#xff0c;玩游…

【3DS】必做清单

3DS必做清单 引言 翻新后的小贴士 本文用于记录我的New Nindendo 3DSLL 软件翻新历程。 因为国内很多都提供现成的懒人包&#xff0c;如果上游有更新&#xff0c;没办法第一时间拿到。 如果你的网络条件够好&#xff0c;可以试试在Universal-Updater里面搜对应软件名字就好. 晚…

dstwo linux 模拟器,dstwo sfc模拟器插件Catsfc使用教程

dstwo作为史上最为优秀的一款nds烧录卡&#xff0c;这个烧录卡不仅支持完美运行nds游戏&#xff0c;还可以利用强大的硬件来运行许多经典模拟器游戏&#xff0c;其中就包括经典的sfc模拟器&#xff0c;下面给大家带来一款目前在兼容性和速度最好的dstwo用sfc模拟器插件Catsfc的…

nds linux模拟器下载,NDS模拟器Desmume

DeSmuME是一个 Nintendo Dual Screen 模拟器。开源&#xff0c;更新很勤快有希望能替代 No$GBA。DeSmuME是一个开源的适用于Linux&#xff0c;Mac OS和Windows的任天堂DS(NDS)模拟器。 DeSmuME支持保存&#xff0c;增加屏幕的大小&#xff0c;支持的过滤器&#xff0c;以提高图…

nds linux模拟器下载,NDS模拟器

《NDS模拟器》是一款能在电脑上模拟NDS的软件。DeSmuMe模拟器在图像和声音上有较大的优化。尤其表现在图像质量方面&#xff0c;颜色更加鲜明&#xff0c;甚至许多用NO$GBA看不清楚地细节都可以在DeSmuME中看到。 NDS模拟器软件背景 DeSmuME 最初是由YopYop156使用C开发并运行在…

Linux端NDS模拟器DeSmuME添加金手指

本文以Deepin上的DeSmuME客户端为例来说明如何添加金手指。本文参考的文章的链接为https://blog.wxm.be/2015/08/09/action-replay-codes-in-desmume-on-linux.html。 通过命令行apt install方式安装的DeSmuME客户端&#xff0c;游戏的存档、金手指等文件位于 ~/.config/desmum…

excel自动行高后只显示一行怎么回事?

当Excel自动调整行高后&#xff0c;如果只显示一行&#xff0c;可能是因为单元格中的文本内容过多&#xff0c;导致显示不全。可以尝试以下解决办法&#xff1a; 1. 双击单元格的边界。双击单元格的边界可以将单元格的高度调整为适合文本内容的高度。 2. 改变设置。点击单元格…

搭建Nextcloud私有云【零基础搭建私有云盘并内网穿透远程访问】

文章目录 摘要视频教程1. 环境搭建2. 测试局域网访问3. 内网穿透3.1 ubuntu本地安装cpolar3.2 创建隧道3.3 测试公网访问 4 配置固定http公网地址4.1 保留一个二级子域名4.1 配置固定二级子域名4.3 测试访问公网固定二级子域名 转载自cpolar极点云的文章&#xff1a;使用Nextcl…

Ampere 又放大招,推出自研192 核AmpereOne 系列处理器,已投产

作者 | 伍杏玲 近日&#xff0c;Ampere Computing 发布2023年度战略和产品路线图&#xff0c;并推出全新的AmpereOne系列处理器&#xff0c;拥有多达 192 个单线程 Ampere 核&#xff0c;内核数量为业界最高。这是第一款基于 Ampere 新自研核的产品&#xff0c;由 Ampere 自有…

软件测试周刊(第18期):一个精确的测量胜过一千个专家的意见

这里记录过去一周我们看到的软件测试及周边的行业动态&#xff0c;周五发布。 本周刊开源&#xff08;GitHub: SoftwareTestingWeekly &#xff09;&#xff0c;欢迎提交 issue&#xff0c;投稿或推荐软件测试相关的内容。 科普 碳中和 碳达峰、碳中和最近频繁出现在大众视野…

【Linux】Nginx编译安装及系统服务添加

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 Nginx 一、关于 NginxNginx和Apache的差异Apache的优势Nginx的优势 二. 编译安装Nginx服务1.关闭防火墙2.安装依赖包3.创建运行用户、组4.编译安装Nginx5.检查、启动、重启、…

清华大学刘知远教授:如何写一篇合格的NLP论文

作者 | 刘知远 编辑 | NewBeeNLP 来源 | 左下角阅读原文处 周末重读&分享清华大学刘知远老师的干货文章&#xff0c;虽然题目是如何写一篇合格的NLP文章&#xff0c;但是可以适用于人工智能相关的其他领域&#xff0c;以下是原文&#xff0c;希望也对你有帮助~ 前几天刚过…

[当人工智能遇上安全] 2.清华张超老师 - GreyOne: Discover Vulnerabilities with Data Flow Sensitive Fuzzing

您或许知道&#xff0c;作者后续分享网络安全的文章会越来越少。但如果您想学习人工智能和安全结合的应用&#xff0c;您就有福利了&#xff0c;作者将重新打造一个《当人工智能遇上安全》系列博客&#xff0c;详细介绍人工智能与安全相关的论文、实践&#xff0c;并分享各种案…