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>

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Golang Gin系列-7:认证和授权

在本章中&#xff0c;我们将探讨Gin框架中身份验证和授权的基本方面。这包括实现基本的和基于令牌的身份验证&#xff0c;使用基于角色的访问控制&#xff0c;应用中间件进行授权&#xff0c;以及使用HTTPS和漏洞防护保护应用程序。 实现身份认证 Basic 认证 Basic 认证是内置…

CTF-web: phar反序列化+数据库伪造 [DASCTF2024最后一战 strange_php]

step 1 如何触发反序列化? 漏洞入口在 welcome.php case delete: // 获取删除留言的路径&#xff0c;优先使用 POST 请求中的路径&#xff0c;否则使用会话中的路径 $message $_POST[message_path] ? $_POST[message_path] : $_SESSION[message_path]; $msg $userMes…

C语言自定义数据类型详解(一)——结构体类型(上)

什么是自定义数据类型呢&#xff1f;顾名思义&#xff0c;就是我们用户自己定义和设置的类型。 在C语言中&#xff0c;我们的自定义数据类型一共有三种&#xff0c;它们分别是&#xff1a;结构体(struct)&#xff0c;枚举(enum)&#xff0c;联合(union)。接下来&#xff0c;我…

SpringCloud系列教程:微服务的未来(十八)雪崩问题、服务保护方案、Sentinel快速入门

前言 在分布式系统中&#xff0c;雪崩效应&#xff08;Avalanche Effect&#xff09;是一种常见的故障现象&#xff0c;通常发生在系统中某个组件出现故障时&#xff0c;导致其他组件级联失败&#xff0c;最终引发整个系统的崩溃。为了有效应对雪崩效应&#xff0c;服务保护方…

升级到Mac15.1后pod install报错

升级Mac后&#xff0c;Flutter项目里的ios项目运行 pod install报错&#xff0c; 遇到这种问题&#xff0c;不要着急去百度&#xff0c;大概看一下报错信息&#xff0c;每个人遇到的问题都不一样。 别人的解决方法并不一定适合你&#xff1b; 下面是报错信息&#xff1a; #…

STM32 PWM驱动舵机

接线图&#xff1a; 这里将信号线连接到了开发板的PA1上 代码配置&#xff1a; 这里的PWM配置与呼吸灯一样&#xff0c;呼吸灯连接的是PA0引脚&#xff0c;输出比较单元用的是OC1通道&#xff0c;这里只需改为OC2通道即可。 完整代码&#xff1a; #include "servo.h&quo…

使用 concurrently 实现前后端一键启动

使用 concurrently 实现前后端一键启动 本文适合&#xff1a; 前后端分离项目&#xff08;如 React Node.js&#xff09;&#xff0c;希望通过一条命令同时启动前端和后端服务。 工具链&#xff1a; Node.js、npm、concurrently。 耗时&#xff1a; 3 分钟。 文章目录 使用 c…

【NLP251】NLP RNN 系列网络

NLP251 系列主要记录从NLP基础网络结构到知识图谱的学习 &#xff11;.原理及网络结构 &#xff11;.&#xff11;&#xff32;&#xff2e;&#xff2e; 在Yoshua Bengio论文中( http://proceedings.mlr.press/v28/pascanu13.pdf )证明了梯度求导的一部分环节是一个指数模型…

OpenCV:在图像中添加噪声(瑞利、伽马、脉冲、泊松)

目录 简述 1. 瑞利噪声 2. 伽马噪声 3. 脉冲噪声 4. 泊松噪声 总结 相关阅读 OpenCV&#xff1a;在图像中添加高斯噪声、胡椒噪声-CSDN博客 OpenCV&#xff1a;高通滤波之索贝尔、沙尔和拉普拉斯-CSDN博客 OpenCV&#xff1a;图像处理中的低通滤波-CSDN博客 OpenCV&…

小智 AI 聊天机器人

小智 AI 聊天机器人 &#xff08;XiaoZhi AI Chatbot&#xff09; &#x1f449;参考源项目复现 &#x1f449; ESP32SenseVoiceQwen72B打造你的AI聊天伴侣&#xff01;【bilibili】 &#x1f449; 手工打造你的 AI 女友&#xff0c;新手入门教程【bilibili】 项目目的 本…

亚博microros小车-原生ubuntu支持系列:16 机器人状态估计

本来想测试下gmapping建图&#xff0c;但是底层依赖了yahboomcar_bringup做底层的数据处理&#xff0c;所以先把依赖的工程导入。 程序启动后&#xff0c;会订阅imu和odom数据&#xff0c;过滤掉一部分的imu数据后&#xff0c;然后与odom数据进行融合&#xff0c;最后输出一个…

C++中的类与对象(中)

在上一节中&#xff0c;我们初步了解了一下&#xff0c;C中的类&#xff0c;这一概念&#xff0c;这一节让我们进一步深入了解一下。 文章目录 目录 前言 一、类中的默认成员函数 1.1 构造函数 构造函数的特点&#xff1a; 1.2 析构函数 析构函数的特点&#xff1a; 1.3 …

Kotlin开发(六):Kotlin 数据类,密封类与枚举类

引言 想象一下&#xff0c;你是个 Kotlin 开发者&#xff0c;敲着代码忽然发现业务代码中需要一堆冗长的 POJO 类来传递数据。烦得很&#xff1f;别急&#xff0c;Kotlin 贴心的 数据类 能帮你自动生成 equals、hashCode&#xff0c;直接省时省力&#xff01;再想想需要多种状…

redis数据安全与性能保障

数据安全与性能保障 1、持久化1.1 快照持久化1.2 AOF持久化1.3 重写/压缩AOF文件 2、复制2.1 Redis复制的启动过程2.2 主从链 3、处理系统故障3.1 验证快照文件和AOF文件 4、事务4.1 java中的redis事务使用 如有侵权&#xff0c;请联系&#xff5e; 如有错误&#xff0c;也欢迎…

数据分析系列--③RapidMiner算子说明及数据预处理

一、算子说明 1.新建过程 2.算子状态灯 状态灯说明: (1)状态指示灯&#xff1a; 红色:指示灯说明有参数未被设置或输入端口未被连接等问题; 黄色:指示灯说明还未执行算子&#xff0c;不管配置是否基本齐全; 绿色:指示灯说明一切正常&#xff0c;已成功执行算子。 (2)三角…

基于Go语言的三甲医院人机与智能体协同环境系统(上.文章部分)

一、引言 1.1 研究背景与意义 1.1.1 三甲医院对高效协同系统的需求 三甲医院作为医疗体系的核心力量,承担着疑难病症诊治、医学科研教学等重要任务,其业务具有高度的复杂性。在日常运营中,三甲医院涉及多个科室,每个科室又包含众多专业领域,各科室之间需要紧密协作,共…

js笔记(黑马程序员)

&#xff08;Web APIs day4&#xff09; 一、日期对象 1.实例化 在代码中发现了 new 关键字时&#xff0c;一般将这个操作称为实例化 创建一个时间对象并获取时间// 1&#xff0e;得到当前时间 2.日期对象方法 因为日期对象返回的数据我们不能直接使用&#xff0c;所以需…

SOME/IP--协议英文原文讲解2

前言 SOME/IP协议越来越多的用于汽车电子行业中&#xff0c;关于协议详细完全的中文资料却没有&#xff0c;所以我将结合工作经验并对照英文原版协议做一系列的文章。基本分三大块&#xff1a; 1. SOME/IP协议讲解 2. SOME/IP-SD协议讲解 3. python/C举例调试讲解 4.1 Speci…

python-leetcode-反转链表 II

92. 反转链表 II - 力扣&#xff08;LeetCode&#xff09; # Definition for singly-linked list. # class ListNode: # def __init__(self, val0, nextNone): # self.val val # self.next next class Solution:def reverseBetween(self, head: Optional…

LM Studio 本地部署DeepSeek及其他AI模型的详细操作教程及硬件要求

本篇文章主要讲解&#xff0c;通过LM Studio工具实现各类型AI模型本地部署的操作方法方式。 作者&#xff1a;任聪聪 日期&#xff1a;2025年1月29日 LM Studio 介绍&#xff1a; LM Studio是一款能够本地离线运行各类型大语言模型的客户端应用&#xff0c;通过LM Studio 可以…