[springboot] 分离第三方依赖独立打包pom配置

在用springboot开发项目是,打包好的jar包是可以直接运行的,但是通常情况下,这个jar都会很大,因为他默认打包了所有依赖的jar包。此时就可以通过maven-dependency-plugin等插件将依赖包复制到独立的文件夹,在启动jar包的时候引用即可。

Pom文件配置

<?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 http://maven.apache.org/xsd/maven-4.0.0.xsd">
	<modelVersion>4.0.0</modelVersion>

	<groupId>org.spring.example</groupId>
	<artifactId>rabbitmq-access</artifactId>
	<version>1.0.1</version>
	<packaging>jar</packaging>

	<name>example</name>
	<description>demo for spring boot</description>

	<parent>
		<groupId>org.springframework.boot</groupId>
		<artifactId>spring-boot-starter-parent</artifactId>
		<version>2.1.0.RELEASE</version>
		<relativePath/> <!-- lookup parent from repository -->
	</parent>

	<properties>
		<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
		<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
		<java.version>1.8</java.version>
		<skipTests>true</skipTests>
	</properties>

	<dependencies>
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-web</artifactId>
		</dependency>
		<dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
	</dependencies>

	<build>
        <!-- 打包输出的根目录 -->
		<!-- <directory>target/${project.version}</directory> -->
		<plugins>
			<plugin>
				<groupId>org.springframework.boot</groupId>
				<artifactId>spring-boot-maven-plugin</artifactId>
				<configuration>
					<!--跳过 spring-boot repackage 排除org和BOOT-INF文件夹(用于子模块打包) -->
					<skip>true</skip>
					<!-- 注意:如果跳过 spring-boot repackage 则以下子配置均失效  -->
					<!-- 指定该jar包启动时的主类[建议] -->
					<mainClass>com.bo.rmqac.RabbitmqAccessApplication</mainClass>
					<!-- 打包类型(JAR、WAR、ZIP、DIR、NONE) -->
					<layout>ZIP</layout>
					<!-- 打包后的名称 默认取 artifactId -->
                    <!-- <finalName>maven</finalName> -->
                    <!-- 打包后的路径 -->
                    <!-- <outputDirectory>${project.build.directory}/${project.version}/</outputDirectory> -->
					<includes>
						<!-- 排除第三方依赖jar(只保留本项目的jar) -->
						<include>
							<groupId>${project.groupId}</groupId>
							<artifactId>${project.artifactId}</artifactId>
						</include>
					</includes>
				</configuration>
			</plugin>

			<!-- 打源码包 -->
			<plugin>
				<groupId>org.apache.maven.plugins</groupId>
				<artifactId>maven-source-plugin</artifactId>
	                <configuration>
	                    <attach>true</attach>
	                </configuration>
				<executions>
					<execution>
						<id>attach-sources</id>
						<phase>compile</phase>
						<goals>
							<goal>jar-no-fork</goal>
						</goals>
					</execution>
				</executions>
			</plugin>

			<!-- 把项目依赖的第三方包打包在 ${project.build.directory}/lib -->
			<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>${project.build.directory}/lib</outputDirectory>
							<excludeTransitive>false</excludeTransitive>
							<stripVersion>false</stripVersion>
							<includeScope>runtime</includeScope>
						</configuration>
					</execution>
				</executions>
			</plugin>
			<!-- 把项目的资源文件打包到 ${project.build.directory}/config -->
	        <plugin>
	            <artifactId>maven-resources-plugin</artifactId>
	            <executions>
	                <execution>
	                    <id>copy-dependencies</id>
	                    <phase>package</phase>
	                    <goals>
	                        <goal>copy-resources</goal>
	                    </goals>
	                    <configuration>
	                        <!-- 资源文件输出目录 -->
	                        <outputDirectory>${project.build.directory}/config</outputDirectory>
	                        <resources>
	                            <resource>
	                                <directory>src/main/resources</directory>
	                                <filtering>true</filtering>
	                                <!--包含的文件-->
	                                <includes>
	                                    <include>*/**</include>
	                                </includes>
	                            </resource>
	                        </resources>
	                    </configuration>
	                </execution>
	            </executions>
	        </plugin>

	        <!-- ★配置打包插件:描述信息、打包文件 -->
	        <plugin>
	            <groupId>org.apache.maven.plugins</groupId>
	            <artifactId>maven-jar-plugin</artifactId>
	            <configuration>
	                <archive>
	                    <!-- 生成的jar中是否包含pom.xml和pom.properties这两个文件 -->
	                    <addMavenDescriptor>false</addMavenDescriptor>
	                    <manifest>
	                        <!-- 解决maven仓库里带时间戳的包的问题:使用spring boot打包插件可以不配置 -->
	                        <useUniqueVersions>true</useUniqueVersions>
	                        <!-- 是否要把第三方jar加入到类构建路径 -->
	                        <addClasspath>true</addClasspath>
	                        <!-- 外部依赖jar包的路径前缀 -->
	                        <classpathPrefix>lib/</classpathPrefix>
	                        <!-- 配置项目启动类:使用spring boot打包插件可以不配置 -->
	                        <mainClass>org.spring.test.BootApplication</mainClass>
	                    </manifest>
	                    <!-- 指定配置文件的目录:配置的路径是相对所要运行的jar所在的目录-->
	                    <manifestEntries>
	                        <Class-Path>./</Class-Path>
	                    </manifestEntries>
	                </archive>
	                <excludes>
	                    <!-- 以target/classes为根目录 -->
	                    <!-- 资源文件排除 -->
	                    <exclude>/*.*</exclude>
	                    <!-- <exclude>**/logback.xml</exclude> -->
	                    <!--  <exclude>/META-INF/</exclude> -->
	                    <!-- html页面排除 -->
	                    <exclude>/templates/</exclude>
	                    <!-- 静态文件排除 -->
	                    <exclude>/static/</exclude>
	                </excludes>
	            </configuration>
        	</plugin>
		</plugins>
        
		<resources>
			<!-- 打包src/main/java下的xml文件 -->
			<resource>
				<directory>src/main/java</directory>
				<includes>
					<include>**/*.xml</include>
				</includes>
			</resource>
			<!-- 排除resources下的配置文件(测试只有打源码包生效) -->
			<resource>
				<!-- 是否将配置文件中的mvn占位符替换为具体值 -->
				<!-- {@see https://www.cnblogs.com/wangxuejian/p/13556306.html} -->
				<filtering>true</filtering>
				<directory>src/main/resources</directory>
				<excludes>
					<exclude>static/**</exclude>
					<exclude>templates/**</exclude>
					<exclude>*.yml</exclude>
					<exclude>*.properties</exclude>
					<exclude>*.xml</exclude>
					<exclude>*.txt</exclude>
				</excludes>
				<!-- <targetPath>BOOT-INF/classes/</targetPath> -->
			</resource>
			<!-- 打包本地自定义jar包 -->
			<resource>
				<directory>lib</directory>
				<includes>
					<include>**/*.jar</include>
				</includes>
				<!-- <targetPath>BOOT-INF/lib/</targetPath> -->
			</resource>
		</resources>
	</build>

</project>

配置说明

  • spring-boot-maven-plugin:springboot打包插件,只保留本项目运行的jar包。
  • maven-dependency-plugin:把项目依赖的第三方jar打包在 target/lib下面。
  • maven-source-plugin:打包源码,配置中指定了phase为compile,意思是在mvn生命周期为compile时将源文件打包,即只要执行的mvn命令包含compile阶段,就会将源代码打包。phase还可以指定为verify、package、install 等。
  • ## 单独打源码包命令:mvn source:jar 或 mvn source:test-jar(会生成在target目录下)
  • ## 打包同时生成源码包:mvn clean source:jar install 等。
  • ## 注意:在多项目构建中,将 source-plugin 置于顶层或 parent 的 pom 中并不会发挥作用,必须置于具体项目的 pom 中。
  • maven-resource-plugin:复制配置文件到指定目录。
  • maven-jar-plugin:maven 打包插件,配置jar包描述信息和打包文件。
  • resources:排除需要外置的资源文件,经测试 src/main/resources 的配置并不能排除 SpringBoot 项目打包的资源文件,只在打源码包插件有效。
  • ## 注意在本地测试环境下,不要在 src/main/resources 中配置 exclude *.properties 或 *.xml ,可能导致运行时无法加载配置文件。

运行方式

将编译目录下 project.jar (运行包)、依赖包 lib 以及 配置文件 config 全部部署至服务器同一目录:

  • config
  • lib
  • static
  • templates
  • project.jar 
运行命令:java -jar -Dloader.path=lib project.jar (多个path使用逗号分隔)

配置文件加载规则

SpringBoot 项目启动时会扫描以下位置的 application.properties 或 application.yml 文件作为默认的配置文件,具体的目录位置如下:

-file:./config/subconfig/ (项目根路径下的config的直接子目录)
-file:./config/ (项目根路径下的config文件夹)
-file:./ (项目根路径)
-classpath:/config/ (类路径下的config文件夹)
-classpath:/ (类路径)

上面几个位置的配置文件,优先级由高到低,高优先级配置会覆盖低优先级,不同的配置互补。

需要注意的是,相同目录下 .properties  配置文件的优先级比 .yml 高。

使用命令行参数

使用 jar 包启动参数可以直接覆盖配置文件中的默认值,如果有多个配置项使用空格分开。

java -jar springbootdemo.jar --server.port=8080 --server.servlet.context-path=/demo

使用 spring.config.location 来指定配置文件的新位置,指定的配置文件和 jar 包中默认加载的配置文件共同起作用形成互补配置。

java -jar springbootdemo.jar --spring.config.location=D:/demo/application.properties

更多外部配置文件细节参考:springboot-core-features-externalized-configuration

参考资料

maven 中如何打包源代码

Spring Boot子模块打包去掉BOOT-INF文件夹

使用 maven 自动将源码打包并发布

maven 多环境下切换配置文件 resources 无效问题解决

Spring Boot之maven项目常用打包配置详解

Spring Boot打包分离lib和资源文件并使用Dockerfile构建Docker镜像

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值