登录
/
注册
首页
论坛
其它
首页
科技
业界
安全
程序
广播
Follow
关于
博客
发1篇日志+1圆
记录
发1条记录+2圆币
发帖说明
VIP申请
登录
/
注册
账号
自动登录
找回密码
密码
登录
立即注册
搜索
搜索
关闭
CSDN热搜
程序园
精品问答
技术交流
资源下载
本版
帖子
用户
软件
问答
教程
代码
VIP申请
VIP网盘
网盘
联系我们
道具
勋章
任务
设置
我的收藏
退出
腾讯QQ
微信登录
返回列表
首页
›
业界区
›
业界
›
java使用maven-shade-plugin打包
java使用maven-shade-plugin打包
[ 复制链接 ]
黎瑞芝
2025-6-10 19:02:40
最近正在练习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
相关帖子
GitPod 使用 SpiceDB 实现权限管理
Java 8 终于要被淘汰了!带你速通 Java 8~24 新特性 | 又能跟面试官吹牛皮了
Redis 介绍与 Node.js 使用教程
使用Yolo12算法进行区域内实时目标计数
技术面:Java并发(线程池、ForkJoinPool)
无GC的Java创新设计思路:作用域引用式自动内存管理
SpringBoot使用AOP优雅的实现系统操作日志的持久化!
磁盘性能测试工具FIO-使用教程
Vim在Windows的安装与基本使用
使用unsloth实现LoRA微调
vip免费申请,1年只需15美金$
回复
使用道具
举报
提升卡
置顶卡
沉默卡
喧嚣卡
变色卡
千斤顶
照妖镜
相关推荐
业界
GitPod 使用 SpiceDB 实现权限管理
0
975
事值
2025-09-04
安全
Java 8 终于要被淘汰了!带你速通 Java 8~24 新特性 | 又能跟面试官吹牛皮了
0
726
任修
2025-09-05
业界
Redis 介绍与 Node.js 使用教程
0
200
嗣伐
2025-09-05
业界
使用Yolo12算法进行区域内实时目标计数
0
112
孟清妍
2025-09-05
业界
技术面:Java并发(线程池、ForkJoinPool)
0
144
揉幽递
2025-09-05
业界
无GC的Java创新设计思路:作用域引用式自动内存管理
0
858
昝梓菱
2025-09-05
业界
SpringBoot使用AOP优雅的实现系统操作日志的持久化!
0
108
马璞玉
2025-09-07
业界
磁盘性能测试工具FIO-使用教程
0
351
吕清莹
2025-09-07
安全
Vim在Windows的安装与基本使用
0
377
福清婉
2025-09-07
安全
使用unsloth实现LoRA微调
0
768
心麾浪
2025-09-07
高级模式
B
Color
Image
Link
Quote
Code
Smilies
您需要登录后才可以回帖
登录
|
立即注册
回复
本版积分规则
回帖并转播
回帖后跳转到最后一页
浏览过的版块
安全
签约作者
程序园优秀签约作者
发帖
黎瑞芝
2025-6-10 19:02:40
关注
0
粉丝关注
5
主题发布
板块介绍填写区域,请于后台编辑
财富榜{圆}
敖可
9984
黎瑞芝
9990
杭环
9988
4
凶契帽
9988
5
氛疵
9988
6
猷咎
9986
7
里豳朝
9986
8
肿圬后
9986
9
蝓俟佐
9984
10
虽裘侪
9984
查看更多