写在前面
通常基于SpringBoot框架的项目,在发布打包时会将项目代码和所有依赖文件一起打成一个可执行的、一体化的JAR包,如果项目的依赖包很多,那么这个JAR包就会非常大,如果想把项目依赖的JAR从项目一体化的JAR包中分离出来,该怎么办呢?
具体步骤
①. 修改打包插件
将原来的打包插件:
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<version>2.4.2</version>
<configuration>
<executable>true</executable>
<jvmArguments>-Dfile.encoding=UTF-8</jvmArguments>
</configuration>
</plugin>
替换为下面的打包插件:
<!-- 需要指定启动类,否则报错。-->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<configuration>
<archive>
<!-- 生成的项目JAR包中,不要包含pom.xml和pom.properties这两个文件 -->
<addMavenDescriptor>false</addMavenDescriptor>
<manifest>
<!-- 是否要把第三方依赖的JAR包加入到类构建路径 -->
<addClasspath>true</addClasspath>
<!-- 外部依赖JAR包的存放路径,为了在MANIFEST.MF文件中指定外部依赖的路径 -->
<classpathPrefix>lib/</classpathPrefix>
<!-- 项目主启动类 -->
<mainClass>cn.hadoopx.servicex.ServicexApplication</mainClass>
</manifest>
</archive>
</configuration>
</plugin>
②. 新增文件复制插件
<!-- 复制项目依赖的JAR包到指定的lib目录-->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-dependency-plugin</artifactId>
<executions>
<execution>
<id>copy-lib</id>
<phase>package</phase>
<goals>
<goal>copy-dependencies</goal>
</goals>
<configuration>
<!-- 将外部依赖的JAR包复制到target/lib路径下 -->
<outputDirectory>target/lib</outputDirectory>
<excludeTransitive>false</excludeTransitive>
<stripVersion>false</stripVersion>
<includeScope>runtime</includeScope>
</configuration>
</execution>
</executions>
</plugin>
③. 按常规方式打包
④. 将项目JAR和lib目录复制到项目的部署路径下,执行启动命令
常见问题
①. servicex-test-1.0-SNAPSHOT.jar 中没有主清单属性
由于在打包插件中没有指定项目主启动类导致。