登录
/
注册
首页
论坛
其它
首页
科技
业界
安全
程序
广播
Follow
关于
导读
排行榜
资讯
发帖说明
登录
/
注册
账号
自动登录
找回密码
密码
登录
立即注册
搜索
搜索
关闭
CSDN热搜
程序园
精品问答
技术交流
资源下载
本版
帖子
用户
软件
问答
教程
代码
写记录
写博客
小组
VIP申请
VIP网盘
网盘
联系我们
发帖说明
道具
勋章
任务
淘帖
动态
分享
留言板
导读
设置
我的收藏
退出
腾讯QQ
微信登录
返回列表
首页
›
业界区
›
业界
›
java使用maven-shade-plugin打包
java使用maven-shade-plugin打包
[ 复制链接 ]
黎瑞芝
2025-6-10 19:02:40
程序园永久vip申请,500美金$,无限下载程序园所有程序/软件/数据/等
最近正在练习Flink JAVA编程,但是发现打包后老大的问题。
环境说明:
jdk17
springboot 3.4.6
flink 1.20.0
一、问题发现和解决
在pom.xml的依赖部分,和flink有关的内容如下:
<dependency>
<groupId>org.apache.flink</groupId>
flink-core</artifactId>
<version>${flink.version}</version>
<exclusions>
<exclusion>
<groupId>org.slf4j</groupId>
slf4j-api</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.apache.flink</groupId>
flink-streaming-java</artifactId>
<version>${flink.version}</version>
<exclusions>
<exclusion>
<groupId>org.slf4j</groupId>
slf4j-api</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.apache.flink</groupId>
flink-table-api-java</artifactId>
<version>${flink.version}</version>
<exclusions>
<exclusion>
<groupId>org.slf4j</groupId>
slf4j-api</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.apache.flink</groupId>
flink-table-api-java-bridge</artifactId>
<version>${flink.version}</version>
<exclusions>
<exclusion>
<groupId>org.slf4j</groupId>
slf4j-api</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.apache.flink</groupId>
flink-table-planner-loader</artifactId>
<version>${flink.version}</version>
<exclusions>
<exclusion>
<groupId>org.slf4j</groupId>
slf4j-api</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.apache.flink</groupId>
flink-table-runtime</artifactId>
<version>${flink.version}</version>
<exclusions>
<exclusion>
<groupId>org.slf4j</groupId>
slf4j-api</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.apache.flink</groupId>
flink-connector-files</artifactId>
<version>${flink.version}</version>
</dependency>
<dependency>
<groupId>org.apache.flink</groupId>
flink-csv</artifactId>
<version>${flink.version}</version>
</dependency>
<dependency>
<groupId>org.apache.flink</groupId>
flink-connector-jdbc</artifactId>
<version>${flink-connector.jdbc.version}</version>
</dependency>
<dependency>
<groupId>org.apache.flink</groupId>
flink-clients</artifactId>
<version>${flink.version}</version>
<exclusions>
<exclusion>
<groupId>org.slf4j</groupId>
slf4j-api</artifactId>
</exclusion>
</exclusions>
</dependency>
复制代码
一开始用的是spring-boot-maven-plugin进行打包,但是总会提示某些类找不到。
事实是有关的jar都打入了,但就是无法找到。主要的原因是SPI无法找到(在META-INF/services/下无法找到对应的spi定义)
折腾了一会,发现无法搞定。
后来发现可以使用maven-shade-plugin解决这个问题。
注:SPI即Service Provider Interface,中文称为
服务供应商接口
参考地址:https://docs.oracle.com/en/java/javase/11/docs/api/java.base/java/util/ServiceLoader.html
打包配置如下:
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
maven-compiler-plugin</artifactId>
<version>3.13.0</version>
<configuration>
<source>${java.version}</source>
<target>${java.version}</target>
<encoding>${project.build.sourceEncoding}</encoding>
<parameters>true</parameters>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
maven-shade-plugin</artifactId>
<version>3.6.0</version>
<executions>
<execution>
<phase>package</phase>
<goals>
<goal>shade</goal>
</goals>
<configuration>
<excludes>
<exclude>com.google.code.findbugs:jsr305</exclude>
</excludes>
</artifactSet>
<filters>
<filter>
*:*</artifact>
<excludes>
<exclude>META-INF/*.SF</exclude>
<exclude>META-INF/*.DSA</exclude>
<exclude>META-INF/*.RSA</exclude>
</excludes>
</filter>
</filters>
<transformers>
<transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
<mainClass>org.lzfto.flink.demo.DemoApplication</mainClass>
</transformer>
<transformer implementation="org.apache.maven.plugins.shade.resource.ServicesResourceTransformer"/>
</transformers>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
<resources>
<resource>
<directory>src/main/resources/</directory>
<includes>
<include>**/*.js</include>
<include>**/*.css</include>
<include>**/*.yml</include>
<include>**/*.xml</include>
<include>**/*.txt</include>
<include>**/*.png</include>
<include>**/*.jpeg</include>
<include>**/*.jpg</include>
<include>**/*.svg</include>
<include>**/*.properties</include>
<include>**/*.Factory</include>
<include>**/*.json</include>
<include>META-INF/services/*.Factory</include>
</includes>
</resource>
<resource>
<directory>libs</directory>
<targetPath>/BOOT-INF/lib/</targetPath>
<includes>
<include>**/*.jar</include>
</includes>
</resource>
</resources>
<finalName>lzfto-${lzfto.flinktest.version}</finalName>
</build>
复制代码
Shade插件使用ServicesResourceTransformer解决SPI加载问题。
二、比较Shade和Springboot
为了便于行文,以Shade表示maven-shade-plugin,以Springboot表示spring-boot-maven-plugin
也就是说一般情况下,使用maven-shade-plugin比使用spring-boot-maven-plugin更好一些,好处有两点:
1.很容易解决SPI问题。也许spring-boot-maven-plugin可以通过自定义LayOut解决SPI问题
2.Shade打好的包加载速度更快
,看下图(用rar打开后的看到的文件结构),并没有Springboot那样把库都放在BOOT-INF/libs,而是完全展开的class
当然,springboot也并非没有优势,使用较高版本的springboot,有一些额外的配置(看个人需要),例如(部分特新示例):
参考:https://docs.spring.io/spring-boot/maven-plugin/build-info.html
<project>
<modelVersion>4.0.0</modelVersion>
build-info</artifactId>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
spring-boot-maven-plugin</artifactId>
<executions>
<execution>
<goals>
<goal>build-info</goal>
</goals>
<configuration>
<encoding.source>UTF-8</encoding.source>
<encoding.reporting>UTF-8</encoding.reporting>
<java.version>${java.version}</java.version>
</additionalProperties>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</build>
</project>
复制代码
大部分情况下,二者都需要maven-compiler-plugin解决某些问题,例如:
指定编译参数,如-parameters保留方法参数名、-Xlint启用警告检查等
指定编译版本和代码编码
处理模块系统
有关编译器插件的内容参见:https://maven.apache.org/plugins/maven-compiler-plugin/
来源:程序园用户自行投稿发布,如果侵权,请联系站长删除
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
java
使用
maven
shade
plugin
相关帖子
Java 25 (LTS) 重磅发布:AI、性能、安全全面革新,新手入门门槛再创新低!
Java Optional 完全指南:优雅处理 null 的利器
追踪链路--使用iptables/ipvs来记录后端pod真实ip
上下文协议(MCP)Java SDK 指南
使用Python免费合并PDF文件
Java函数式接口——渐进式学习
大语言模型~Ollama本地模型和java一起体验LLM
使用DNGuard加密并打包C# .NET Core程序为单一EXE文件
最小二乘问题详解9:使用Ceres求解非线性最小二乘
go项目使用go build 与 MakeFile 构建项目
回复
使用道具
举报
提升卡
置顶卡
沉默卡
喧嚣卡
变色卡
千斤顶
照妖镜
相关推荐
安全
Java 25 (LTS) 重磅发布:AI、性能、安全全面革新,新手入门门槛再创新低!
2
320
肿圬后
2025-12-16
业界
Java Optional 完全指南:优雅处理 null 的利器
0
972
古修蟑
2025-12-17
业界
追踪链路--使用iptables/ipvs来记录后端pod真实ip
0
803
硫辨姥
2025-12-17
业界
上下文协议(MCP)Java SDK 指南
0
294
豌笆
2025-12-17
安全
使用Python免费合并PDF文件
0
602
洪势
2025-12-18
业界
Java函数式接口——渐进式学习
0
500
列蜜瘘
2025-12-18
安全
大语言模型~Ollama本地模型和java一起体验LLM
0
488
裴涛
2025-12-18
安全
使用DNGuard加密并打包C# .NET Core程序为单一EXE文件
2
749
嫁吱裨
2025-12-19
业界
最小二乘问题详解9:使用Ceres求解非线性最小二乘
0
498
挚魉
2025-12-19
业界
go项目使用go build 与 MakeFile 构建项目
0
626
杓疠?
2025-12-21
回复
(1)
雌鲳签
2025-12-5 09:14:37
回复
使用道具
举报
照妖镜
猛犸象科技工作室:
网站开发,备案域名,渗透,服务器出租,DDOS/CC攻击,TG加粉引流
谢谢分享,辛苦了
高级模式
B
Color
Image
Link
Quote
Code
Smilies
您需要登录后才可以回帖
登录
|
立即注册
回复
本版积分规则
回帖并转播
回帖后跳转到最后一页
浏览过的版块
安全
签约作者
程序园优秀签约作者
发帖
黎瑞芝
2025-12-5 09:14:37
关注
0
粉丝关注
12
主题发布
板块介绍填写区域,请于后台编辑
财富榜{圆}
3934307807
991124
anyue1937
9994892
kk14977
6845358
4
xiangqian
638210
5
韶又彤
9997
6
宋子
9981
7
闰咄阅
9993
8
刎唇
9993
9
俞瑛瑶
9998
10
蓬森莉
9949
查看更多
今日好文热榜
957
企业级多智能体系统(MAS)架构深度研究:C
191
北京守嘉陪诊登顶2025年度陪诊行业排行 专
234
流量暴跌 96%:AI 聊天机器人正在构建危险
172
AI生成论文查重能过么?8款AI写论文软件测
508
懒人长期理财的投资系统
507
第40次CCFCSP认证邮寄
867
第40次CCFCSP认证邮寄
853
第40次CCFCSP认证邮寄
439
用 .NET MAUI 10 + VS Copilot 从 0 开发一
869
【节点】[GammaToLinearSpaceExact节点]原
378
[20251218]测试sql语句子光标的执行性能(21
496
HECTF2025
16
《C语言程序设计》琐碎知识点总结笔记
378
NGD-SLAM(三)
46
AI 领域职业发展分享总结(吴恩达新课内容
103
【面试题】数据库事务隔离与传播属性是什么
191
2025年儿童羽绒服十大名牌排名:宝妈选购指
314
2025年儿童羽绒服十大名牌排名:宝妈选购指
761
Flink源码阅读:如何生成ExecutionGraph
421
Github项目CI&CD部署