当前位置: 首页 > news >正文

maven的打包插件如何使用

默认的情况下,当直接执行maven项目的编译命令时,对于结果来说是不打第三方包的,只有一个单独的代码jar,想要打一个包含其他资源的完整包就需要用到maven编译插件,使用时分以下几种情况

第一种:当只是想单纯的开发一个maven项目,不涉及其他复杂的项目结构,最后只需要一个全部资源可执行jar,就用如下插件pom

<build><plugins><!-- Maven Assembly Plugin 是maven官方的编译打包插件--><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-assembly-plugin</artifactId><version>3.3.0</version><!-- 插件的配置参数相关--><configuration><!-- 当你在打可执行包,也就是结果包是一个jar时,可以指定主类--><archive><manifest><mainClass>com.yourpackage.MainClass</mainClass> <!-- 指定主类 --></manifest></archive><!-- 这里需要给一个结果包的后缀,用来区分--><descriptorRefs><descriptorRef>jar-with-dependencies</descriptorRef></descriptorRefs></configuration><!-- 插件的执行阶段定义,可以有多个,不过一般一个打包的就够了 --><executions><execution><!-- 这个id是自定的,保证有多个执行阶段的时候是唯一的就行 --><id>make-assembly</id><!-- 这个执行阶段在maven的那个阶段生效,这里绑定在打包时生效 --><phase>package</phase><!-- 这个single是固定的不用变,意思是根据给定的或者默认的配置来执行编译,默认时是打当前项目的所有dependencies为一个完整包,这个参数不要过多纠结官方文档中也只有这个,你要能力够可以自己封装 --><goals><goal>single</goal></goals></execution></executions></plugin></plugins>
</build>

打包后项目的输出路径下,除了原本的最小jar外,会有一个包名包含jar-with-dependencies的jar
在这里插入图片描述
第二种:assembly是一个比较好用的编译插件,无论是单独打jar,还是整个项目打归档类的包,都能胜任,不过早些年ssm那个时代,Java常用的编译插件是compiler,这个插件现在也有人用,不过它在打包的时候常常出问题,所以用它来打包的话,保险起见要指定resources。同时它只能打jar包,并且不能指定主类,在ssm这种web开发使用到的比较多,而 Spring boot之后官方提供了自己的编译插件,再加上它没有assembly那么好用,所以现在用的不多

<build><plugins><!-- maven在进行一些编译操作所使用的插件 --><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-compiler-plugin</artifactId><version>3.5.1</version><configuration><source>1.8</source><target>1.8</target><encoding>UTF-8</encoding></configuration></plugin></plugins><resources><resource><directory>src/main/java</directory><!--所在的目录--><includes><include>**/*.properties</include><include>**/*.xml</include></includes><filtering>false</filtering></resource><resource><directory>src/main/resources</directory><!--所在的目录--><includes><include>**/*.xml</include><include>**/*.properties</include></includes><filtering>false</filtering></resource></resources></build>

第三种:在多数情况下项目结构比较复杂,比如父子项目,或者需要打一些其他特别的资源文件到结果包中,又或者结果不止需要插件打默认的jar包,因此除非是某个模块或者项目真的就只打一个简单的完整包会使用第一种编译方式外,其他情况需要提供assembly完整的打包说明文件,使用方式如下

首先在需要的项目pom中声明打包用的插件。这里注意一下,一定要把所有需要打包的资源放在一个专门用来打包的子模块中,因为这个插件没办法跨项目打资源,总之我这边本地是尝试了之后没发现能跨模块打资源的方法,最多能做到按照描述文件各打各的,但是然并朊啊

    <build><plugins><plugin><!-- 插件和版本 --><groupId>org.apache.maven.plugins</groupId><artifactId>maven-assembly-plugin</artifactId><version>3.3.0</version><!-- 这里!!!!需要给插件提供一个打包阶段的描述文件,并且当你这样使用的时候,第一种情况的主类和前缀配置就不要配了,一来是大概率不生效,二来这种给定描述文件的方式通常是用来打归档类结果文件的,也就是tar这种,而不是一个单一的可执行jar --><configuration><descriptors><!-- ${project.basedir}是maven自带的变量,可以获取当前项目的根路径 --><descriptor>${project.basedir}/assembly.xml</descriptor></descriptors></configuration><executions><execution><id>make-assembly</id><phase>package</phase><goals><goal>single</goal></goals></execution></executions></plugin></plugins></build>

下面是描述文件的内容

<assembly><!-- 设置结果集的id,最后会作为结果文件名的后缀 --><id>bin</id><!-- 指定结果集的格式,可以支持zip, tar, tar.gz等,可以写多个结果就会有对应的多个 --><formats><format>tar.gz</format></formats><includeBaseDirectory>true</includeBaseDirectory><!-- 指定结果集中包含的文件集 --><fileSets><fileSet><directory>${project.basedir}/bin</directory><outputDirectory>/bin</outputDirectory><includes><include>*</include></includes><fileMode>0644</fileMode></fileSet></fileSets><!-- 指定程序集中包含的依赖项集,这个一般使用的时候就是固定的格式 --><dependencySets><dependencySet><!-- 包含所有依赖项,到lib --><outputDirectory>/lib</outputDirectory><!-- 包含项目自身的jar --><useProjectArtifact>true</useProjectArtifact><!-- 还可以指定依赖即便但是一般不写,打全部的 <scope>runtime</scope>--></dependencySet></dependencySets></assembly>

上面这个文件内容是通常情况下的使用内容,一般也够了,但是描述文件中还有其他的标签可以用,你可以在网上查它的约束消息,下面一些可能会用到的标签,大家参考一下就行了

<assembly><!-- 设置结果集的id,最后会作为后缀 --><id>bin</id><!-- 指定结果集的格式,可以支持zip, tar, tar.gz等 --><formats><format>tar.gz</format><format>dir</format></formats><!-- 在结果集中是否包含一个基本目录,默认值是true,就好比我们使用开源软件解压之后是个完整的目录,而不是全部在当前目录解压所有文件 --><includeBaseDirectory>true</includeBaseDirectory><!-- 设置生成程序集存档的基本目录名,如果没有设置并且includeBaseDirectory为true,则使用${project.build.finalName}作为基本目录名,一般都用默认的 --><baseDirectory>${project.build.finalName}</baseDirectory><!-- 在最终档案中是否包含一个站点目录,默认值是false,这个只有在特殊情况在可能用true --><includeSiteDirectory>false</includeSiteDirectory><!-- 这个很少会用到,它是用来让插件自动合并或定制一些文件,比如多个properties文件聚合成一个,有需要的话网上找找案例就行 --><containerDescriptorHandlers><containerDescriptorHandler><handlerName>metaInf-services</handlerName><configuration><!-- 配置选项,具体根据需求填写 --></configuration></containerDescriptorHandler></containerDescriptorHandlers><!-- 指定包含在程序集中的模块文件,这个也用的很少,因为程序运行的jar一般会打到一个固定的路径下,而且如果你的使用方式和我一样,那么需要的资源就已经在一个专门编译用的子模块下了,不会涉及到从其他模块里面再去指定 --><moduleSets><moduleSet><!-- 包含当前项目的所有模块 --><useAllReactorProjects>true</useAllReactorProjects><!-- 指定包含或排除的模块 --><includes><include>com.example:my-module</include></includes><excludes><exclude>com.example:excluded-module</exclude></excludes><!-- 设置输出目录 --><outputDirectory>modules</outputDirectory></moduleSet></moduleSets><!-- 指定程序集中包含的文件集,这个很长用 --><fileSets><fileSet><directory>src/main/resources</directory><outputDirectory>conf</outputDirectory><includes><include>*.xml</include><include>*.properties</include></includes><fileMode>0644</fileMode></fileSet></fileSets><!-- 指定程序集中包含的依赖项集 --><dependencySets><dependencySet><!-- 包含所有依赖项 --><outputDirectory>lib</outputDirectory><scope>runtime</scope></dependencySet></dependencySets>
</assembly>

第四种情况:Maven项目可以用来Java和Scala混编,但是上面的maven-assembly-plugin编译不了scala文件,所以需要用下面的两个插件配合,一个是java的,一个是scala的,先编译最后统一用shade打包,但是这种方式只能打可执行jar,至于混编下打tar包, 目前还没有遇到这种情况。

<build><!-- 这里规定插件版本 --><pluginManagement><plugins><!-- 编译scala的插件 --><plugin><groupId>net.alchim31.maven</groupId><artifactId>scala-maven-plugin</artifactId><version>3.2.2</version></plugin><!-- 编译java的插件 --><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-compiler-plugin</artifactId><version>3.5.1</version></plugin></plugins></pluginManagement><plugins><!-- 规定Scala怎么编译 注意这里只规定编译,不规定打包--><plugin><groupId>net.alchim31.maven</groupId><artifactId>scala-maven-plugin</artifactId><executions><!-- 这两个 Execution,规定编译源码添加资源 ,第2个测试编译可以不要--><execution><id>scala-compile-first</id><phase>process-resources</phase><goals><goal>add-source</goal><goal>compile</goal></goals></execution><execution><id>scala-test-compile</id><phase>process-test-resources</phase><goals><goal>testCompile</goal></goals></execution></executions></plugin><!-- 这里是规定怎么编译java --><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-compiler-plugin</artifactId><configuration><source>1.8</source><target>1.8</target><encoding>UTF-8</encoding></configuration><executions><!-- 作用和上面的一样,只不过这里不用显示的调用add来添加资源 --><execution><phase>compile</phase><goals><goal>compile</goal></goals></execution></executions></plugin><!-- shade插件用来把上面的所有资源统一打包成一个新的jar --><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-shade-plugin</artifactId><version>2.4.3</version><executions><execution><phase>package</phase><goals><goal>shade</goal></goals><configuration><transformers><transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer"><mainClass>com.example.MainClass</mainClass> <!-- 如果需要打包可执行jar,可以在这里指定主类,不过一般用不着,和混编一般是应用在数据引擎或实时处理上的,对应的引擎有主类的指定,直接上传一个jar包就好 --></transformer></transformers><filters><filter><!-- 打包所有的资源,并过滤中间文件 --><artifact>*:*</artifact><excludes><exclude>META-INF/*.SF</exclude><exclude>META-INF/*.DSA</exclude><exclude>META-INF/*.RSA</exclude></excludes></filter></filters></configuration></execution></executions></plugin></plugins></build>

第五种:一般情况下需要自己找插件的就这上面几种情况,市面上有些架构有自己的编译插件,比如上面提到的springboot,springboot的编译插件相当简洁,整个spring Boot框架能把能砍掉的繁杂配置步骤全砍了,编译完会有两个结果,用没有后缀的就行

<plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId><configuration><mainClass>com.example.bootweb.BootWebApplication</mainClass></configuration>
</plugin>

相关文章:

maven的打包插件如何使用

默认的情况下&#xff0c;当直接执行maven项目的编译命令时&#xff0c;对于结果来说是不打第三方包的&#xff0c;只有一个单独的代码jar&#xff0c;想要打一个包含其他资源的完整包就需要用到maven编译插件&#xff0c;使用时分以下几种情况 第一种&#xff1a;当只是想单纯…...

solidity高阶 -- 线性继承

Solidity是一种面向合约的高级编程语言&#xff0c;用于编写智能合约。在Solidity中&#xff0c;多线继承是一个强大的特性&#xff0c;允许合约从多个父合约继承属性和方法。本文将详细介绍Solidity中的多线继承&#xff0c;并通过不同的实例展示其使用方法和注意事项。 在Sol…...

国内外大语言模型领域发展现状与预期

在数字化浪潮中&#xff0c;大语言模型已成为人工智能领域的关键力量&#xff0c;深刻影响着各个行业的发展轨迹。下面我们将深入探讨国内外大语言模型领域的发展现状以及未来预期。 一、发展现状 &#xff08;一&#xff09;国外进展 美国的引领地位&#xff1a;OpenAI 的 …...

【Leetcode 热题 100】416. 分割等和子集

问题背景 给你一个 只包含正整数 的 非空 数组 n u m s nums nums。请你判断是否可以将这个数组分割成两个子集&#xff0c;使得两个子集的元素和相等。 数据约束 1 ≤ n u m s . l e n g t h ≤ 200 1 \le nums.length \le 200 1≤nums.length≤200 1 ≤ n u m s [ i ] ≤ …...

C语言------数组从入门到精通

1.一维数组 目标:通过思维导图了解学习一维数组的核心知识点: 1.1定义 使用 类型名 数组名[数组长度]; 定义数组。 // 示例&#xff1a; int arr[5]; 1.2一维数组初始化 数组的初始化可以分为静态初始化和动态初始化两种方式。 它们的主要区别在于初始化的时机和内存分配的方…...

物管系统赋能智慧物业管理提升服务质量与工作效率的新风潮

内容概要 在当今的物业管理领域&#xff0c;物管系统的崛起为智慧物业管理带来了新的机遇和挑战。这些先进的系统能够有效整合各类信息&#xff0c;促进数字化管理&#xff0c;从而提升服务质量和工作效率。通过物管系统&#xff0c;物业管理者可以实时查看和分析各种数据&…...

2024年记 | 凛冬将至

放弃幻想&#xff0c;准备斗争&#xff01; 考研or就业&#xff1f; 上大学以来&#xff0c;考研上名校在我的心里一直是一颗种子&#xff0c;2024年初&#xff0c;当时的想法是考研和就业两手抓。买了张宇的高数现代&#xff0c;想要死磕&#xff01; 也记了挺多笔记... 如果…...

MySQL数据导入与导出

在现代软件开发中,数据管理是一个重要的核心环节,而数据库则是进行数据管理的主要工具。MySQL 作为一款开源的关系型数据库管理系统,被广泛应用于企业和个人开发项目中。对于学习编程的初学者或是自学者来说,掌握 MySQL 的基本操作尤为重要,尤其是数据的导入与导出功能。这…...

NoSQL与SQL比较

1.认识NoSQL NoSql可以翻译做Not Only Sql&#xff08;不仅仅是SQL&#xff09;&#xff0c;或者是No Sql&#xff08;非Sql的&#xff09;数据库。是相对于传统关系型数据库而言&#xff0c;有很大差异的一种特殊的数据库&#xff0c;因此也称之为非关系型数据库。 1.1.结构…...

Ceph:关于Ceph 中使用 RADOS 块设备提供块存储的一些笔记整理(12)

写在前面 准备考试,整理 ceph 相关笔记博文内容涉及使用 RADOS 块设备提供块存储理解不足小伙伴帮忙指正对每个人而言,真正的职责只有一个:找到自我。然后在心中坚守其一生,全心全意,永不停息。所有其它的路都是不完整的,是人的逃避方式,是对大众理想的懦弱回归,是随波…...

Android SystemUI——最近任务列表启动(十八)

前面分析了初始化涉及到的关键类,系统启动后会启动 SystemUI 进程,然后进行一系列初始化,接下来看一下进入 Recents 的流程。我们主要分析最近任务应用列表的启动与显示。 一、最近任务启动 关于手势或 Key 按键触发这一块逻辑处理入口都是在 PhoneWindowManager,咱们从 R…...

数据结构课程设计(三)构建决策树

3 决策树 3.1 需求规格说明 【问题描述】 ID3算法是一种贪心算法&#xff0c;用来构造决策树。ID3算法起源于概念学习系统&#xff08;CLS&#xff09;&#xff0c;以信息熵的下降速度为选取测试属性的标准&#xff0c;即在每个节点选取还尚未被用来划分的具有最高信息增益的…...

从ChatGPT热潮看智算崛起

2025年1月7日&#xff0c;科智咨询发布《2025年IDC产业七大发展趋势》&#xff0c;其中提到“ChatGPT开启生成式AI热潮&#xff0c;智能算力需求暴涨&#xff0c;算力供给结构发生转变”。 【图片来源于网络&#xff0c;侵删】 为何会以ChatGPT发布为节点呢&#xff1f;咱们一起…...

基于PyQt设计的智能停车管理系统

文章目录 一、前言1.1 项目介绍【1】项目开发背景【2】设计实现的功能【3】设计意义【4】国内外研究现状【6】摘要1.2 设计思路1.3 系统功能总结1.4 开发工具的选择【1】VSCODE【2】python【3】ptqt【4】HyperLPR31.5 参考文献二、安装Python环境1.1 环境介绍**1.2 Python版本介…...

http的请求体各项解析

一、前言 做Java开发的人员都知道&#xff0c;其实我们很多时候不单单在写Java程序。做的各种各样的系统&#xff0c;不管是PC的 还是移动端的&#xff0c;还是为别的系统提供接口。其实都离不开http协议或者https 这些东西。Java作为编程语言&#xff0c;再做业务开发时&#…...

【linux】Linux 常见目录特性、权限和功能

目录特性默认权限主要功能/用途/根目录&#xff0c;所有目录的起点755文件系统的顶层目录&#xff0c;包含所有其他子目录和文件/bin基础二进制命令目录&#xff08;系统启动和修复必需的命令&#xff09;755存放所有用户可用的基本命令&#xff08;如 ls, cp, bash 等&#xf…...

创作三载·福启新章2025

写在前面&#xff1a;本博客仅作记录学习之用&#xff0c;部分图片来自网络&#xff0c;如需引用请注明出处&#xff0c;同时如有侵犯您的权益&#xff0c;请联系删除&#xff01; 文章目录 前言机缘收获日常憧憬 总结 前言 在2022年01月26日&#xff0c;我踏上了技术创作的征…...

RoboMaster- RDK X5能量机关实现案例(一)识别

作者&#xff1a;SkyXZ CSDN&#xff1a;https://blog.csdn.net/xiongqi123123 博客园&#xff1a;https://www.cnblogs.com/SkyXZ 在RoboMaster的25赛季&#xff0c;我主要负责了能量机关的视觉方案开发&#xff0c;目前整体算法已经搭建完成&#xff0c;实际方案上我使用的上…...

Python帝王學集成-母稿

引用:【【全748集】这绝对是2024最全最细的Python全套教学视频,七天看完编程技术猛涨!别再走弯路了,从零基础小白到Python全栈这一套就够了!-哔哩哔哩】 https://b23.tv/lHPI3XV 语法基础 Python解释器与pycharm编辑器安装 - 定义:Python解释器负责将Python代码转换为计…...

安全漏洞扫描与修复系统的高质量技术详解

安全漏洞扫描与修复系统的高质量技术详解 在当今的数字化时代&#xff0c;网络安全已成为企业和个人不可忽视的重要议题。安全漏洞扫描与修复系统作为保障网络安全的关键环节&#xff0c;其重要性日益凸显。本文将深入探讨安全漏洞扫描与修复系统的原理、流程、工具选择以及实…...

JavaScript反爬技术解析与应对

JavaScript 反爬技术解析与应对 前言 在当今 Web 爬虫与数据抓取的生态环境中&#xff0c;网站运营方日益关注数据安全与隐私保护&#xff0c;因此逐步采用多种反爬技术来限制非授权访问。本文从 JavaScript 角度出发&#xff0c;深入剖析主流反爬策略的技术原理&#xff0c;…...

[NOIP2007]矩阵取数游戏

点我写题 题目描述 帅帅经常跟同学玩一个矩阵取数游戏&#xff1a;对于一个给定的n*m的矩阵&#xff0c;矩阵中的每个元素aij均为非负整数。游戏规则如下&#xff1a; 1.每次取数时须从每行各取走一个元素&#xff0c;共n个。m次后取完矩阵所有元素&#xff1b; 2.每次取走的…...

在Linux系统上安装.NET

测试系统&#xff1a;openKylin(开放麒麟) 1.确定系统和架构信息&#xff1a; 打开终端&#xff08;Ctrl Alt T&#xff09;&#xff0c;输入cat /etc/os-release查看系统版本相关信息。 输入uname -m查看系统架构。确保你的系统和架构符合.NET 的要求&#xff0c;如果架构…...

PCB Editor层叠文件(Gerber文件输出-01)

先看底层和表层,如下图 钢网表层和底层,如下图 丝印表层和底层,如下图 阻焊表层和底层,如下图 下面来添加钻孔层,先提取钻孔表 点击OK后钻孔表会挂在鼠标上...

labelimg闪退的解决办法

其实就是你的python版本太高不稳定不支持labelimg 标记时出现闪退 问题原因&#xff1a;python版本过高 解决方案 第一步&#xff1a; 在python3.9以上的版本运行软件会闪退&#xff0c;这个时候我们需要创建一个3.9或者及以下的虚拟环境 conda cr…...

【开源免费】基于Vue和SpringBoot的在线文档管理系统(附论文)

本文项目编号 T 038 &#xff0c;文末自助获取源码 \color{red}{T038&#xff0c;文末自助获取源码} T038&#xff0c;文末自助获取源码 目录 一、系统介绍二、演示录屏三、启动教程四、功能截图五、文案资料5.1 选题背景5.2 国内外研究现状5.3 可行性分析 六、核心代码6.1 查…...

数据库管理-第287期 Oracle DB 23.7新特性一览(20250124)

数据库管理287期 20245-01-24 数据库管理-第287期 Oracle DB 23.7新特性一览&#xff08;20250124&#xff09;1 AI向量搜索&#xff1a;算术和聚合运算2 更改Compatible至23.6.0&#xff0c;以使用23.6或更高版本中的新AI向量搜索功能3 Cloud Developer包4 DBMS_DEVELOPER.GET…...

Golang :用Redis构建高效灵活的应用程序

在当前的应用程序开发中&#xff0c;高效的数据存储和检索的必要性已经变得至关重要。Redis是一个快速的、开源的、内存中的数据结构存储&#xff0c;为各种应用场景提供了可靠的解决方案。在这个完整的指南中&#xff0c;我们将学习什么是Redis&#xff0c;通过Docker Compose…...

四层网络模型

互联网由终端主机、链路和路由器组成&#xff0c;数据通过逐跳的方式&#xff0c;依次经过每条链路进行传输。 网络层的工作是将数据包从源端到目的端&#xff0c;跨越整个互联网。 网络层的数据包称为数据报。网络将数据报交给链路层&#xff0c;指示它通过第一条链路发送数据…...

CUDA学习-内存访问

一 访存合并 1.1 说明 本部分内容主要参考: 搞懂 CUDA Shared Memory 上的 bank conflicts 和向量化指令(LDS.128 / float4)的访存特点 - 知乎 1.2 share memory结构 图1.1 share memory结构 放在 shared memory 中的数据是以 4 bytes(即 32 bits)作为 1 个 word,依…...