SpringBoot & Maven 依赖、配置分离打包

介绍

随着技术的迭代,在我们日常的开发中现在普遍都是使用SpringBoot进行开发了,在使用maven构建的传统web应用时,我们都是将项目打包成war包,放在tomcat中部署,各个目录资源都是分离开的,对于配置文件的修改非常方便。但是使用SpringBoot的打包工具的话,默认是打包成一个jar文件,通过java命令就能直接运行,项目会运行在SpringBoot内嵌的web服务器中,我们可以对这两种打包方式做一个横向的对比:

war包 jar包
部署方式 需要放在外部的web容器中才能运行 可以直接使用java命令运行,程序将运行在内嵌的web容器
文件构成 各资源文件分离,如lib、classes、配置文件等,修改和替换文件方便 所有的资源文件都打包在一起,修改跟替换文件很麻烦

也正是因为jar包的打包方式将所有的资源都打包在一起,所以jar包的体积会比较大。动辄上百兆的jar包在服务器上进行部署的时候是非常麻烦的,可能代码只占了20%的大小,依赖的jar包占了70%的大小,但是对于只是代码上小小的改动,也需要整个项目重新打包部署,同时对于一些配置文件的修改也并不是很方便。

修改前

只有一个jar包,大小是53.5MBSpringBoot & Maven 依赖、配置分离打包

修改后

SpringBoot & Maven 依赖、配置分离打包
可以看到将依赖分离后,jar包的体积明显的减小了,而且我们还可以将配置文件单独分离出来,方便我们以后的修改。

配置

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
	<modelVersion>4.0.0</modelVersion>
	<parent>
		<groupId>org.springframework.boot</groupId>
		<artifactId>spring-boot-starter-parent</artifactId>
		<version>2.5.0</version>
		<relativePath/> <!-- lookup parent from repository -->
	</parent>
	<groupId>com.yousan</groupId>
	<artifactId>springboot-maven-package</artifactId>
	<version>0.0.1-SNAPSHOT</version>
	<name>springboot-maven-package</name>
	<description>Demo project for Spring Boot</description>
	<properties>
		<java.version>1.8</java.version>
        <!-- 打包后导出的路径 -->
		<package.path>${project.build.directory}/app</package.path>
	</properties>
	<dependencies>
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-web</artifactId>
		</dependency>
        ......
	</dependencies>

	<build>
		<plugins>
			<!-- 上线部署 JAR启动分离依赖lib和配置 -->
			<!-- 打包jar -->
			<plugin>
				<groupId>org.apache.maven.plugins</groupId>
				<artifactId>maven-jar-plugin</artifactId>
				<configuration>
					<!-- 不打包资源文件 -->
					<excludes>
						<exclude>*.**</exclude>
					</excludes>
					<archive>
						<manifest>
							<addClasspath>true</addClasspath>
							<!-- MANIFEST.MF 中 Class-Path 加入前缀 -->
							<classpathPrefix>lib/</classpathPrefix>
							<!-- jar包不包含唯一版本标识 -->
							<useUniqueVersions>false</useUniqueVersions>
							<!-- 指定入口类 -->
							<mainClass>com.yousan.SpringbootMavenPackageApplication</mainClass>
						</manifest>
						<!--  指定配置文件目录,这样jar运行时会去找到同目录下的config文件夹下查找  -->
						<manifestEntries>
							<Class-Path>config/</Class-Path>
						</manifestEntries>
					</archive>
					<outputDirectory>${package.path}</outputDirectory>
				</configuration>
			</plugin>
			<!-- 拷贝依赖 copy-dependencies -->
			<plugin>
				<groupId>org.apache.maven.plugins</groupId>
				<artifactId>maven-dependency-plugin</artifactId>
				<executions>
					<execution>
						<id>copy-dependencies</id>
						<phase>package</phase>
						<goals>
							<goal>copy-dependencies</goal>
						</goals>
						<configuration>
							<outputDirectory> ${package.path}/lib/ </outputDirectory>
						</configuration>
					</execution>
				</executions>
			</plugin>
			<!-- 拷贝资源文件 copy-resources -->
			<plugin>
				<artifactId>maven-resources-plugin</artifactId>
				<executions>
					<execution>
						<id>copy-resources</id>
						<phase>package</phase>
						<goals>
							<goal>copy-resources</goal>
						</goals>
						<configuration>
							<resources>
								<resource>
									<directory>src/main/resources</directory>
									<!--  指定参与构建的resource -->
									<includes>
										<include>*.**</include>
									</includes>
								</resource>
							</resources>
							<outputDirectory>${package.path}/config</outputDirectory>
						</configuration>
					</execution>
				</executions>
			</plugin>
		</plugins>
	</build>
</project>
上一篇:IDEA一键部署SpringBoot项目到服务器


下一篇:Liunx 安装JDK