在用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