找回密码
 立即注册
首页 业界区 业界 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有关的内容如下:
  1.         
  2.                 <dependency>
  3.                         <groupId>org.apache.flink</groupId>
  4.                         flink-core</artifactId>
  5.                         <version>${flink.version}</version>
  6.                         <exclusions>
  7.                                 <exclusion>
  8.                                         <groupId>org.slf4j</groupId>
  9.                                         slf4j-api</artifactId>
  10.                                 </exclusion>
  11.                         </exclusions>
  12.                 </dependency>
  13.                 <dependency>
  14.                         <groupId>org.apache.flink</groupId>
  15.                         flink-streaming-java</artifactId>
  16.                         <version>${flink.version}</version>
  17.                         <exclusions>
  18.                                 <exclusion>
  19.                                         <groupId>org.slf4j</groupId>
  20.                                         slf4j-api</artifactId>
  21.                                 </exclusion>
  22.                         </exclusions>
  23.                 </dependency>
  24.                 <dependency>
  25.                         <groupId>org.apache.flink</groupId>
  26.                         flink-table-api-java</artifactId>
  27.                         <version>${flink.version}</version>
  28.                        
  29.                         <exclusions>
  30.                                 <exclusion>
  31.                                         <groupId>org.slf4j</groupId>
  32.                                         slf4j-api</artifactId>
  33.                                 </exclusion>
  34.                         </exclusions>
  35.                 </dependency>
  36.                
  37.                 <dependency>
  38.                         <groupId>org.apache.flink</groupId>
  39.                         flink-table-api-java-bridge</artifactId>
  40.                         <version>${flink.version}</version>
  41.                        
  42.                         <exclusions>
  43.                                 <exclusion>
  44.                                         <groupId>org.slf4j</groupId>
  45.                                         slf4j-api</artifactId>
  46.                                 </exclusion>
  47.                         </exclusions>
  48.                 </dependency>
  49.                
  50.                 <dependency>
  51.                         <groupId>org.apache.flink</groupId>
  52.                         flink-table-planner-loader</artifactId>
  53.                         <version>${flink.version}</version>
  54.                        
  55.                         <exclusions>
  56.                                 <exclusion>
  57.                                         <groupId>org.slf4j</groupId>
  58.                                         slf4j-api</artifactId>
  59.                                 </exclusion>
  60.                         </exclusions>
  61.                 </dependency>
  62.                 <dependency>
  63.                         <groupId>org.apache.flink</groupId>
  64.                         flink-table-runtime</artifactId>
  65.                         <version>${flink.version}</version>
  66.                         <exclusions>
  67.                                 <exclusion>
  68.                                         <groupId>org.slf4j</groupId>
  69.                                         slf4j-api</artifactId>
  70.                                 </exclusion>
  71.                         </exclusions>
  72.                 </dependency>
  73.                
  74.                 <dependency>
  75.                         <groupId>org.apache.flink</groupId>
  76.                         flink-connector-files</artifactId>
  77.                         <version>${flink.version}</version>
  78.                 </dependency>
  79.                 <dependency>
  80.                         <groupId>org.apache.flink</groupId>
  81.                         flink-csv</artifactId>
  82.                         <version>${flink.version}</version>
  83.                 </dependency>
  84.                 <dependency>
  85.                         <groupId>org.apache.flink</groupId>
  86.                         flink-connector-jdbc</artifactId>
  87.                         <version>${flink-connector.jdbc.version}</version>
  88.                 </dependency>
  89.                
  90.                 <dependency>
  91.                         <groupId>org.apache.flink</groupId>
  92.                         flink-clients</artifactId>
  93.                         <version>${flink.version}</version>
  94.                         <exclusions>
  95.                                 <exclusion>
  96.                                         <groupId>org.slf4j</groupId>
  97.                                         slf4j-api</artifactId>
  98.                                 </exclusion>
  99.                         </exclusions>
  100.                 </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
 
打包配置如下:
  1. <build>
  2.                 <plugins>
  3.                         <plugin>
  4.                                 <groupId>org.apache.maven.plugins</groupId>
  5.                                 maven-compiler-plugin</artifactId>
  6.                                 <version>3.13.0</version>
  7.                                 <configuration>
  8.                                         <source>${java.version}</source>
  9.                                         <target>${java.version}</target>
  10.                                         <encoding>${project.build.sourceEncoding}</encoding>
  11.                                         <parameters>true</parameters>
  12.                                 </configuration>
  13.                         </plugin>
  14.                         <plugin>
  15.                 <groupId>org.apache.maven.plugins</groupId>
  16.                 maven-shade-plugin</artifactId>
  17.                 <version>3.6.0</version>
  18.                 <executions>
  19.                     
  20.                     <execution>
  21.                         <phase>package</phase>
  22.                         <goals>
  23.                             <goal>shade</goal>
  24.                         </goals>
  25.                         <configuration>
  26.                            
  27.                                 
  28.                                 <excludes>
  29.                                     
  30.                                     <exclude>com.google.code.findbugs:jsr305</exclude>
  31.                                 </excludes>
  32.                             </artifactSet>
  33.                             <filters>
  34.                                 <filter>
  35.                                     
  36.                                     *:*</artifact>
  37.                                     <excludes>
  38.                                         <exclude>META-INF/*.SF</exclude>
  39.                                         <exclude>META-INF/*.DSA</exclude>
  40.                                         <exclude>META-INF/*.RSA</exclude>
  41.                                     </excludes>
  42.                                 </filter>
  43.                             </filters>
  44.                             <transformers>
  45.                                 <transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
  46.                                     <mainClass>org.lzfto.flink.demo.DemoApplication</mainClass>
  47.                                 </transformer>
  48.                                 <transformer implementation="org.apache.maven.plugins.shade.resource.ServicesResourceTransformer"/>
  49.                             </transformers>
  50.                         </configuration>
  51.                     </execution>
  52.                 </executions>
  53.             </plugin>
  54.                 </plugins>
  55.                 <resources>
  56.                         <resource>
  57.                                 <directory>src/main/resources/</directory>
  58.                                 <includes>
  59.                                         <include>**/*.js</include>
  60.                                         <include>**/*.css</include>
  61.                                         <include>**/*.yml</include>
  62.                                         <include>**/*.xml</include>
  63.                                         <include>**/*.txt</include>
  64.                                         <include>**/*.png</include>
  65.                                         <include>**/*.jpeg</include>
  66.                                         <include>**/*.jpg</include>
  67.                                         <include>**/*.svg</include>
  68.                                         <include>**/*.properties</include>
  69.                                         <include>**/*.Factory</include>
  70.                                         <include>**/*.json</include>
  71.                                         <include>META-INF/services/*.Factory</include>
  72.                                 </includes>
  73.                         </resource>
  74.                         <resource>
  75.                                
  76.                                 <directory>libs</directory>
  77.                                
  78.                                 <targetPath>/BOOT-INF/lib/</targetPath>
  79.                                
  80.                                 <includes>
  81.                                         <include>**/*.jar</include>
  82.                                 </includes>
  83.                         </resource>
  84.                 </resources>
  85.                 <finalName>lzfto-${lzfto.flinktest.version}</finalName>
  86.         </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
1.png

 
当然,springboot也并非没有优势,使用较高版本的springboot,有一些额外的配置(看个人需要),例如(部分特新示例):
参考:https://docs.spring.io/spring-boot/maven-plugin/build-info.html
  1. <project>
  2.         <modelVersion>4.0.0</modelVersion>
  3.         build-info</artifactId>
  4.         <build>
  5.                 <plugins>
  6.                         <plugin>
  7.                                 <groupId>org.springframework.boot</groupId>
  8.                                 spring-boot-maven-plugin</artifactId>
  9.                                 <executions>
  10.                                         <execution>
  11.                                                 <goals>
  12.                                                         <goal>build-info</goal>
  13.                                                 </goals>
  14.                                                 <configuration>
  15.                                                        
  16.                                                                 <encoding.source>UTF-8</encoding.source>
  17.                                                                 <encoding.reporting>UTF-8</encoding.reporting>
  18.                                                                 <java.version>${java.version}</java.version>
  19.                                                         </additionalProperties>
  20.                                                 </configuration>
  21.                                         </execution>
  22.                                 </executions>
  23.                         </plugin>
  24.                 </plugins>
  25.         </build>
  26. </project>
复制代码
 
大部分情况下,二者都需要maven-compiler-plugin解决某些问题,例如:

  • 指定编译参数,如-parameters保留方法参数名、-Xlint启用警告检查等
  • 指定编译版本和代码编码
  • 处理模块系统
有关编译器插件的内容参见:https://maven.apache.org/plugins/maven-compiler-plugin/
 

来源:程序园用户自行投稿发布,如果侵权,请联系站长删除
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
您需要登录后才可以回帖 登录 | 立即注册