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><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.rhkb.cn/news/8529.html

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

相关文章

反向代理模块

1 概念 1.1 反向代理概念 反向代理是指以代理服务器来接收客户端的请求&#xff0c;然后将请求转发给内部网络上的服务器&#xff0c;将从服务器上得到的结果返回给客户端&#xff0c;此时代理服务器对外表现为一个反向代理服务器。 对于客户端来说&#xff0c;反向代理就相当…

Java 大视界 -- Java 大数据与碳中和:能源数据管理与碳排放分析(66)

&#x1f496;亲爱的朋友们&#xff0c;热烈欢迎来到 青云交的博客&#xff01;能与诸位在此相逢&#xff0c;我倍感荣幸。在这飞速更迭的时代&#xff0c;我们都渴望一方心灵净土&#xff0c;而 我的博客 正是这样温暖的所在。这里为你呈上趣味与实用兼具的知识&#xff0c;也…

《企业应用架构模式》笔记

领域逻辑 表模块和数据集一起工作-> 先查询出一个记录集&#xff0c;再根据数据集生成一个&#xff08;如合同&#xff09;对象&#xff0c;然后调用合同对象的方法。 这看起来很想service查询出一个对象&#xff0c;但调用的是对象的方法&#xff0c;这看起来像是充血模型…

《剪映5.9官方安装包》免费自动生成字幕

&#xff08;避免失效建议存自己网盘后下载&#xff09;剪映5.9官方Win.Mac 链接&#xff1a;https://pan.xunlei.com/s/VOHc-Fg2XRlD50MueEaOOeW1A1?pwdawtt# 官方唯一的免费版&#xff0c;Win和Mac都有&#xff0c;此版本官方已下架&#xff0c;觉得有用可转存收藏&#xf…

基于RIP的MGRE VPN综合实验

实验拓扑 实验需求 1、R5为ISP&#xff0c;只能进行IP地址配置&#xff0c;其所有地址均配为公有IP地址&#xff1b; 2、R1和R5间使用PPP的PAP认证&#xff0c;R5为主认证方&#xff1b; R2与R5之间使用ppp的CHAP认证&#xff0c;R5为主认证方&#xff1b; R3与R5之间使用HDLC封…

006 mybatis关联查询(一对一、一对多)

文章目录 一对一查询SQL语句方法一&#xff1a;resultType方法二&#xff1a;resultMap创建扩展po类Mapper映射文件Mapper接口测试代码小结 一对多查询SQL语句修改po类Mapper映射文件Mapper接口测试代码 注意&#xff1a;因为一个订单信息只会是一个人下的订单&#xff0c;所以…

RKNN_C++版本-YOLOV5

1.背景 为了实现低延时&#xff0c;所以开始看看C版本的rknn的使用&#xff0c;确实有不足的地方&#xff0c;请指正&#xff08;代码借鉴了rk官方的仓库文件&#xff09;。 2.基本的操作流程 1.读取模型初始化 // 设置基本信息 // 在postprocess.h文件中定义&#xff0c;详见…

消息队列篇--通信协议篇--网络通信模型(OSI7层参考模型,TCP/IP分层模型)

一、OSI参考模型&#xff08;Open Systems Interconnection Model&#xff09; OSI参考模型是一个用于描述和标准化网络通信功能的七层框架。它由国际标准化组织&#xff08;ISO&#xff09;提出&#xff0c;旨在为不同的网络设备和协议提供一个通用的语言和结构&#xff0c;以…

【creo】CREO配置快捷键方式和默认单位

了解CREO工作目录设置 设置快捷方式启动目录&#xff0c;就能自动加载其中的配置。 一、通过键盘快捷方式 保存配置 creo_parametric_customization.ui 文件&#xff1a; 二、通过映射键录制 通过这种方式可以监听鼠标的点击事件。使用键盘快捷方式无法找到需要的动作时候可…

多模态论文笔记——TECO

大家好&#xff0c;这里是好评笔记&#xff0c;公主号&#xff1a;Goodnote&#xff0c;专栏文章私信限时Free。本文详细解读多模态论文TECO&#xff08;Temporally Consistent Transformer&#xff09;&#xff0c;即时间一致变换器&#xff0c;是一种用于视频生成的创新模型&…

自由学习记录(32)

文件里找到切换颜色空间 fgui中的 颜色空间是一种总体使用前的设定 颜色空间&#xff0c;和半透明混合产生的效果有差异&#xff0c;这种问题一般可以产生联系 动效就是在fgui里可以编辑好&#xff0c;然后在unity中也准备了对应的调用手段&#xff0c;可以详细的使用每一个具…

【教学类-99-01】20250127 蛇年红包(WORD模版)

祈愿在2025蛇年里&#xff0c; 伟大的祖国风调雨顺、国泰民安、每个人齐心协力&#xff0c;共同经历这百年未有之大变局时代&#xff08;国际政治、AI技术……&#xff09; 祝福亲友同事孩子们平安健康&#xff08;安全、安全、安全&#xff09;、巳巳如意&#xff01; 背景需…

当高兴、尊重和优雅三位一体是什么情况吗?

英语单词 disgrace 表示“失脸&#xff0c;耻辱&#xff0c;不光彩&#xff0c;名誉扫地”一类的含义&#xff0c;可做名词或动词使用&#xff0c;含义基本一致&#xff0c;只是词性不同。 disgrace n.丢脸&#xff1b;耻辱&#xff1b;不光彩&#xff1b;令人感到羞耻的人(或…

基于RIP的MGRE实验

实验拓扑 实验要求 按照图示配置IP地址配置静态路由协议&#xff0c;搞通公网配置MGRE VPNNHRP的配置配置RIP路由协议来传递两端私网路由测试全网通 实验配置 1、配置IP地址 [R1]int g0/0/0 [R1-GigabitEthernet0/0/0]ip add 15.0.0.1 24 [R1]int LoopBack 0 [R1-LoopBack0]i…

hot100_24. 两两交换链表中的节点

hot100_24. 两两交换链表中的节点 思路1思路2 给你一个链表&#xff0c;两两交换其中相邻的节点&#xff0c;并返回交换后链表的头节点。你必须在不修改节点内部的值的情况下完成本题&#xff08;即&#xff0c;只能进行节点交换&#xff09;。 示例 1&#xff1a; 输入&…

舆情系统的情报搜索功能

引言 随着信息技术的发展和网络媒体的快速发展&#xff0c;舆情监测已成为各行各业不可或缺的工具。舆情系统中的情报搜索功能&#xff0c;作为其核心组成部分&#xff0c;能够帮助用户迅速、全面地捕捉互联网、社交平台、新闻媒体等渠道中的各类信息和舆论动态。情报搜索不仅提…

STM32新建不同工程的方式

新建工程的方式 1. 安装开发工具 MDK5 / keil52. CMSIS 标准3. 新建工程3.1 寄存器版工程3.2 标准库版工程3.3 HAL/LL库版工程3.4 HAL库、LL库、标准库和寄存器对比3.5 库开发和寄存器的关系 4. STM32CubeMX工具的作用 1. 安装开发工具 MDK5 / keil5 MDK5 由两个部分组成&#…

进程间通信

进程间通信 进程间通信介绍 进程间通信⽬的 数据传输&#xff1a;⼀个进程需要将它的数据发送给另⼀个进程 资源共享&#xff1a;多个进程之间共享同样的资源。 通知事件&#xff1a;⼀个进程需要向另⼀个或⼀组进程发送消息&#xff0c;通知它&#xff08;它们&#xff09…

O(1) 时间插入、删除和获取随机元素

hello 大家好&#xff01;今天开写一个新章节&#xff0c;每一天一道算法题。让我们一起来学习算法思维吧&#xff01; 为了实现 RandomizedSet 类&#xff0c;并且保证每个函数的平均时间复杂度为0(1) &#xff0c;我们可以结合使用数组和哈希表。数组用于存储集合中的元素&am…

Nxopen 直齿轮参数化设计

NXUG1953 Visualstudio 2019 参考论文&#xff1a; A Method for Determining the AGMA Tooth Form Factor from Equations for the Generated Tooth Root Fillet //FullGear// Mandatory UF Includes #include <uf.h> #include <uf_object_types.h>// Internal I…