SpringBoot项目的两种打包方式

it2023-12-22  80

情况概述

在SpringBoot项目中使用“mvn package”进行打包操作时,打包生成的jar文件一般只有几十K左右,因为缺少依赖的jar包,所以无法直接运行。

为了能让SpringBoot运行,需要其生成的jar包和项目依赖的jar包等统一再次打包,然后才可以通过“java -jar"的方式运行。

将SpringBoot项目打包成一个可运行的jar文件,通常有两种方式:

在pom.xml中使用spring-boot-maven-plugin插件在pom.xml中给properties节点添加新的配置

方式一:使用spring-boot-maven-plugin插件

在项目的pom.xml中配置spring-boot-maven-plugin插件,其中的关键goal是repackage。

...... <build> <plugins> ... <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> <configuration> <!--项目的启动类--> <mainClass>cn.akioyuan.springdemo.SpringDemoApplication</mainClass> <layout>ZIP</layout> </configuration> <executions> <execution> <goals> <goal>repackage</goal> </goals> </execution> </executions> </plugin> </plugins> </build> ....

这种方式看着添加配置较多,但是在配置完成后,只需要重新执行“mvn package”即可。 执行之后,在项目的target目录看到两个文件。分别是:

my-springboot-demo-0.0.1-SNAPSHOT.jar.originalmy-springboot-demo-0.0.1-SNAPSHOT.jar

可以看到,以original结尾的文件,还是只有几十K,这是没有安装springboot打包插件时,"mvn package"生成的jar文件。

而另一个jar文件通常有几十M,这是采用springboot插件后,再次打包生成的文件。这个文件包括了项目的代码和允许所依赖的各种jar文件。

方式二:在pom.xml的properties节点添加新的配置

如果项目的pom.xml文件以是spring-boot-starter-parent做为父类,类似有如下配置

<parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.2.2.RELEASE</version> <relativePath/> </parent>

则可以不使用spring-boot-maven-plugin插件,只需要pom.xml的properties节点中添加一个子节点。

<properties> ...... <!--项目启动类--> <start-class>cn.akioyuan.springdemo.SpringDemoApplication</start-class> ...... </properties>

但是这时,再次执行“mvn package”的话,生成的jar文件仍然只有几十K,跟原来没啥区别。

这时需要在项目的目录下,执行如下命令:

mvn package spring-boot:repackage # 或者顺便跳过测试代码的编译和运行 mvn -Dmaven.test.skip=true package spring-boot:repackage

-Dmaven.test.skip=true:跳过测试代码的编译和运行 -DskipTests:跳过测试代码的运行

执行后,就会在项目的target目录下看到熟悉的两个文件了。

两种方式的比较

个人相对喜欢第一种方式,因为配置更灵活一些,可以设置要将哪些依赖jar进行打包。例如在配置插件时:

<plugin> ...... <configuration> <mainClass>cn.akioyuan.springdemo.SpringDemoApplication</mainClass> <layout>ZIP</layout> <!-- 指定依赖jar,一般是项目下的其它变动频繁的子项目 --> <includes> <include> <groupId>cn.akioyuan.onlinecourse</groupId> <artifactId>common-utils</artifactId> </include> <include> <groupId>cn.akioyuan.onlinecourse</groupId> <artifactId>service-edu</artifactId> </include> </includes> </configuration> ...... </plugin>

这样的话,打包后的jar文件,就只包括项目文件和指定的依赖文件,会比将全部依赖文件都打包要小很多,通常不超过5M。上传到服务器很有优势:)

操作流程

先将全部依赖打包生成一个大的jar文件,再将此jar文件解压,将相关依赖复制到一个文件夹(commonlib)中。这里需要注意的是要剔除子项目生成的jar文件。指定项目依赖的子项目,重新打包,生成小的jar文件。执行“java -jar”时,指定commlib即可 java -server -Xms128m -Xmx512m --Dloader.path=./commonlib -jar ./my-springboot-demo-0.0.1-SNAPSHOT.jar
最新回复(0)