Spring Boot 分离资源文件打包

Spring Boot项目默认的会打包成单一的jar文件,但是有时候我们并不想让配置文件、依赖包都跟可执行文件打包到一起。这时候可以在pom.xml文件中进行配置,从而使资源文件、依赖包和可执行文件分离。pom.xml配置如下:
(补充:鉴于此种方式看起来太过繁琐,总是有人在使用中出问题,故今天在文末补充一种比较简单的实现方式,推荐使用)

	<build>
		<plugins>
			<!--**********分离资源文件及依赖包打包配置*************-->
			<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>target/lib</outputDirectory>
							<excludeTransitive>false</excludeTransitive>
							<stripVersion>false</stripVersion>
							<includeScope>runtime</includeScope>
						</configuration>
					</execution>
				</executions>
			</plugin>

			<plugin>
				<groupId>org.apache.maven.plugins</groupId>
				<artifactId>maven-jar-plugin</artifactId>
				<configuration>
					<excludes>
						<exclude>**/*.properties</exclude>
						<exclude>**/*.xml</exclude>
						<exclude>static/**</exclude>
						<exclude>templates/**</exclude>
					</excludes>
				</configuration>
			</plugin>

			<plugin>
				<groupId>org.springframework.boot</groupId>
				<artifactId>spring-boot-maven-plugin</artifactId>
				<configuration>
					<layout>ZIP</layout>
					<includes>
						<include>
							<groupId>non-exists</groupId>
							<artifactId>non-exists</artifactId>
						</include>
					</includes>
				</configuration>
				<executions>
					<execution>
						<goals>
							<goal>repackage</goal>
						</goals>
						<configuration>
							<classifier>classes</classifier>
							<attach>false</attach>
						</configuration>
					</execution>
				</executions>
			</plugin>
			<plugin>
				<groupId>org.apache.maven.plugins</groupId>
				<artifactId>maven-antrun-plugin</artifactId>
				<executions>
					<execution>
						<phase>package</phase>
						<goals>
							<goal>run</goal>
						</goals>
						<configuration>
							<target>
								<property name="dist">target/build</property>
								<property name="res">target/build/resources</property>
								<property name="dist-tmp">target/build/tmp</property>
								<property name="app-name">${project.artifactId}-${project.version}</property>
								<property name="real-app-name">${project.artifactId}</property>
								<delete dir="${dist}" />
								<mkdir dir="${dist}" />
								<mkdir dir="${dist-tmp}" />
								<mkdir dir="${res}" />
								<copy file="target/${app-name}.jar" tofile="${dist-tmp}/${app-name}.jar" />
								<unzip src="${dist-tmp}/${app-name}.jar" dest="${dist-tmp}" />
								<delete file="${dist-tmp}/${app-name}.jar" />
								<move file="target/${app-name}-classes.jar" tofile="${dist}/${real-app-name}.jar"/>
								<move todir="${dist}/lib">
									<fileset dir="target/lib" />
								</move>

								<delete dir="${dist-tmp}" />

								<copy todir="${res}">
									<fileset dir="target/classes">
										<include name="**/static/**" />
										<include name="**/templates/**" />
									</fileset>
								</copy>
								<copy todir="${res}">
									<fileset dir="target/classes">
										<include name="**/*.properties" />
										<include name="**/*.xml" />
										<include name="**/*.yml" />
									</fileset>
								</copy>
							</target>
						</configuration>
					</execution>
				</executions>
			</plugin>
		</plugins>
	</build>

maven打包完成后,可以在target目录下看到一个build目录,进入该目录的结构如图:
这里写图片描述
test.jar文件就是可执行文件,资源文件和配置文件都在resources目录下,依赖的jar包都在lib目录下。
运行方式:java -jar -Dloader.path=resources,lib test.jar

实现方式2(推荐)

pom文件配置

<build>
	<plugins>
		<plugin>
			<!--打包时去除第三方依赖-->
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-maven-plugin</artifactId>
			<configuration>
				<layout>ZIP</layout>
				<includes>
					<include>
						<groupId>non-exists</groupId>
						<artifactId>non-exists</artifactId>
					</include>
				</includes>
			</configuration>
		</plugin>
		<!--拷贝第三方依赖文件到指定目录-->
		<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>
						<!--target/lib是依赖jar包的输出目录,根据自己喜好配置-->
						<outputDirectory>target/lib</outputDirectory>
						<excludeTransitive>false</excludeTransitive>
						<stripVersion>false</stripVersion>
						<includeScope>runtime</includeScope>
					</configuration>
				</execution>
			</executions>
		</plugin>
	</plugins>
</build>

假设设置的maven打包目录是target,打包完成后,可以在target目录下看到一个lib目录和可执行的jar文件,lib目录内包含了项目依赖的所有jar包。

使用方式
  1. 项目发布运行的时侯,比如发布目录是app,那么就将lib目录和对应的jar文件复制到app目录,执行

    java -jar -Dloader.path=lib (可执行的jar包名称).jar

    命令即可。

  2. 如果要实现资源文件和配置文件外置,只需再将原项目的resources目录复制到app目录下,然后执行

    java -jar -Dloader.path=resources,lib (可执行的jar包名称).jar

    命令即可。

示例

鉴于有人说这种方式没用,今天抽空补下示例图
![![在这里插入图片描述](https://img-blog.csdnimg.cn/20190621181330446.png](https://img-blog.csdnimg.cn/20190622152314449.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3UwMTMzMTQ3ODY=,size_16,color_FFFFFF,t_70

注意

如果在windows10系统下运行,要用cmd,不要用PowerShell,否则可能会报Error: Unable to access jarfile xxx异常。

评论 19
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值