maven工程怎么将除工程源码外的三方依赖一起打包到jar中

news/2024/10/19 15:16:07/

前言

现在,大家都在使用springboot来创建工程,基本很少关注打包的问题,springboot的spring boot maven plugin可以很方便的创建一个可执行的jar文件,并且包含项目的所有依赖。最近改一个老项目,纯maven项目,引入依赖后,编译通过,然后打包后,执行jar文件,总是提示类找不到,一番排查,忘记添加打包插件了。默认情况下,maven只会打包我们自己写的源码,并不会把引入的其他依赖一块打到jar里。

方法一:使用Maven Assembly Plugin插件打包

在pom.xml中添加Maven Assembly Plugin 配置:

<build>  <plugins>  <plugin>  <groupId>org.apache.maven.plugins</groupId>  <artifactId>maven-assembly-plugin</artifactId>  <version>3.3.0</version> <!-- 请根据需要选择最新版本 -->  <configuration>  <archive>  <manifest>  <mainClass>com.example.MainClass</mainClass> <!-- 替换为你的主类 -->  </manifest>  </archive>  <descriptorRefs>  <descriptorRef>jar-with-dependencies</descriptorRef>  </descriptorRefs>  <appendAssemblyId>false</appendAssemblyId></configuration>  <executions>  <execution>  <id>make-assembly</id>  <phase>package</phase>  <goals>  <goal>single</goal>  </goals>  </execution>  </executions>  </plugin>  </plugins>  
</build>

注意:1、当工程中没有主类时

                <archive>  <manifest>  <mainClass>com.example.MainClass</mainClass> <!-- 替换为你的主类 -->  </manifest>  </archive>  

可以省略。
2、 <appendAssemblyId>false</appendAssemblyId>这行代码,默认不写的时候,值为true。 它能干啥呢?
当默认不写这行代码的时候,你执行打包完成后,会得到两个.jar结尾的jar文件。一个为 p r o j e c t . a r t i f a c t I d − {project.artifactId}- project.artifactId{project.version}.jar
和 一个为 p r o j e c t . a r t i f a c t I d − {project.artifactId}- project.artifactId{project.version}-jar-with-dependencies.jar这么两个文件。

(1) p r o j e c t . a r t i f a c t I d − {project.artifactId}- project.artifactId{project.version}.jar

只包含我们开发时编写的代码

(2) p r o j e c t . a r t i f a c t I d − {project.artifactId}- project.artifactId{project.version}-jar-with-dependencies.jar

包含我们开发时编写的代码和引入的第三方依赖的源代码

那么问题就来了,我们想要文件名称为 p r o j e c t . a r t i f a c t I d − {project.artifactId}- project.artifactId{project.version}.jar,同时还需要jar文件中包含所有的依赖,怎么办呢?配置上 <appendAssemblyId>false</appendAssemblyId>这样代码就ok了。 按照字面翻译appendAssemblyId追加组装标识,说的就是jar-with-dependencies这个文件名的后缀。

方法二:使用Maven Shade Plugin插件打包

在 pom.xml 中添加 Maven Shade Plugin 配置:

<build>  <plugins>  <plugin>  <groupId>org.apache.maven.plugins</groupId>  <artifactId>maven-shade-plugin</artifactId>  <version>3.2.4</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> <!-- 替换为你的主类 -->  </transformer>  </transformers>  </configuration>  </execution>  </executions>  </plugin>  </plugins>  
</build>

注意:1、当没有主类时,

            <configuration><transformers><transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer"><mainClass>com.example.MainClass</mainClass> <!-- 替换为你的主类 --></transformer></transformers></configuration>

这段代码可以省略。
2、使用maven-shade-plugin打包完的也得到两个jar文件。 p r o j e c t . a r t i f a c t I d − {project.artifactId}- project.artifactId{project.version}.jar和original- p r o j e c t . a r t i f a c t I d − {project.artifactId}- project.artifactId{project.version}.jar 这两个。
(1) p r o j e c t . a r t i f a c t I d − {project.artifactId}- project.artifactId{project.version}.jar

包含开发时我们写的代码,和引入的第三方依赖的源码

(2)original- p r o j e c t . a r t i f a c t I d − {project.artifactId}- project.artifactId{project.version}.jar

只包含开发时我们写的代码

总结

方法一和方法二都可以实现将代码打包成jar文件,通过比较我们发现方法二在代码量上更是好更简洁,生成的文件也更直观,不用特殊配置去掉后缀。总体来讲,两种方式都比较实用,针对个人情况,自行选择即可。

翻了一下,spring boot maven plugin的源码,发现它的底层原来也是用maven-shade-plugin来实现的。其实估计大家也能猜到个大概,毕竟也就这么写主流的技术。
在这里插入图片描述


http://www.ppmy.cn/news/1540275.html

相关文章

Matlab 二维绘图命令(第一期)

基本绘图 plot 基本二维绘图函数 格式&#xff1a; plot(x,y,’s’) plot(x1,y1,’s1’,x2,y2,’s2’…) s为一字符串&#xff0c;用于设置绘图颜色和类型 绘图颜色与类型 颜色&#xff1a;b(默认&#xff1a;蓝)、g(绿)、r(红)、c(青)、m(洋红)、y(黄)、k(黑) 线型&am…

三、MyBatis实践:提高持久层数据处理效率(1)(包含mybatis下载官网)

一、Mybatis简介 1.1 简介 https://mybatis.org/mybatis-3/zh/index.html MyBatis最初是Apache的一个开源项目iBatis, 2010年6月这个项目由Apache Software Foundation迁移到了Google Code。随着开发团队转投Google Code旗下&#xff0c; iBatis3.x正式更名为MyBatis。代码于…

探索 C# 的进阶特性

随着 C# 语言的不断演进&#xff0c;越来越多的特性被引入&#xff0c;提升了代码的可读性和性能。这些进阶特性为开发者提供了更多简洁而强大的工具&#xff0c;用来编写高效、优雅的代码。本文将介绍 C# 中的一些重要进阶特性&#xff0c;包括属性模式匹配、异常过滤器、记录…

网站建设完成后,多久需要升级迭代一次

网站建设完成后&#xff0c;一般每隔几个月就会进行一次迭代升级。以下是关于网站迭代周期和原因的具体分析&#xff1a; 更新频率&#xff1a;网站在建设完成后&#xff0c;一般每隔几个月就会进行一次迭代升级。这种周期性的更新有助于保持网站的现代感和竞争力。更新目的&a…

微信小程序定位判断点位是否在某个范围内(腾讯地图转百度地图)

业务:比较微信小程序定位是否在系统设置的某个位置的某个范围内 问题:微信小程序的定位是拿的腾讯地图的经纬度(假设为点A),系统设置的某个位置是百度地图的经纬度(假设为点B),需要判断点A是否在点B的Range(米)范围内 解决方案:将腾讯点A的经纬度转换为百度地图的经纬度后再进行…

iptables限速规则

环境&#xff1a; iptables服务器&#xff1a;172.16.12.33 client&#xff1a;192.168.1.2 1、在防火墙上配置客户端的下载速度是1M/s &#xff08;1个包是1.3KB&#xff09; #限速客户端每秒的下载速度是1024KB&#xff0c;超出限制的流量就丢弃 [rootiptables-172-16-12-…

Web安全常见问题

OSI七层模型和HTTP请求 OSI 物理层-数据链路层-网络层-传输层-会话层-表示层-应用层 五层协议 物理层-数据链路层-网络层-传输层-应用层 HTTP请求类型&#xff1a; GET 请求的数据在url头 POST 请求的数据在请求体 PUT 更新资源 DELETE 删除 CONNECT http/1.1协议中预留…

HIKROBOT_SDK_text1——机器人控制权

1.切换示教员&#xff0c;然后在示教器释放掉控制权 2.连接机器人代码 #include <memory> #include <Windows.h> #include <stdio.h> #include <stdlib.h> #include <string.h>#include "MP_Public_API.h"int main() {int64_t llRet…