SpringBoot项目的两种打包方式

时间:2025-03-12 08:46:01

情况概述

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

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

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

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

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

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

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

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

  1. my-springboot-demo-0.0.
  2. my-springboot-demo-0.0.

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

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

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

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

<parent>
	<groupId></groupId>
	<artifactId>spring-boot-starter-parent</artifactId>
	<version>2.2.</version>
	<relativePath/> 
</parent>

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

<properties>
	......
	<!--项目启动类-->
	<start-class></start-class>
	......
</properties>

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

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

mvn package spring-boot:repackage

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

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

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

两种方式的比较

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

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

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

操作流程

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