在SpringBoot项目中使用“mvn package”进行打包操作时,打包生成的jar文件一般只有几十K左右,因为缺少依赖的jar包,所以无法直接运行。
为了能让SpringBoot运行,需要其生成的jar包和项目依赖的jar包等统一再次打包,然后才可以通过“java -jar"的方式运行。
将SpringBoot项目打包成一个可运行的jar文件,通常有两种方式:
在pom.xml中使用spring-boot-maven-plugin插件在pom.xml中给properties节点添加新的配置在项目的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文件以是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。上传到服务器很有优势:)
