springboot-填坑系列-jar启动分离依赖lib和配置
前言
- 先前发布boot项目的时候,改动一点东西,就需要将整个项目重新打包部署,十分不便,故把依赖lib从项目分离出来,每次部署只需要发布代码即可。
半自动化步骤
步骤1,更换maven的jar打包插件
-
先前使用的是spring-boot-maven-plugin来打包
- 这个插件会将项目所有的依赖打入BOOT-INF/lib下
替换为maven-jar-plugin
- addClasspath表示需要加入到类构建路径
- classpathPrefix指定生成的Manifest文件中Class-Path依赖lib前面都加上路径,构建出lib/
<plugin>
<groupId></groupId>
<artifactId>maven-jar-plugin</artifactId>
<version>${}</version>
<configuration>
<archive>
<manifest>
<addClasspath>true</addClasspath>
<classpathPrefix>lib/</classpathPrefix>
<mainClass></mainClass>
</manifest>
</archive>
</configuration>
</plugin>
步骤2,拷贝依赖到jar外面的lib目录
<plugin>
<groupId></groupId>
<artifactId>maven-dependency-plugin</artifactId>
<version>${}</version>
<executions>
<execution>
<id>copy-lib</id>
<phase>prepare-package</phase>
<goals>
<goal>copy-dependencies</goal>
</goals>
<configuration>
<outputDirectory>${}/lib</outputDirectory>
<overWriteReleases>false</overWriteReleases>
<overWriteSnapshots>false</overWriteSnapshots>
<overWriteIfNewer>true</overWriteIfNewer>
<includeScope>compile</includeScope>
</configuration>
</execution>
</executions>
</plugin>
步骤3: 在和jar包同级的目录下新建一个config目录,放入文件
-
这里可能有小伙伴有疑问了,打包的jar里面不是应该有文件吗,这里为什么再放一份?
- 这是因为boot读取配置有一个优先级,放在jar包外面config目录优先级最高,主要是便于从外部修改配置,而不是改jar包中的文件。优先级如下:
- 当前目录的config目录下
- 当前目录
- classpath的config目录下
- classpath的根目录
- 这是因为boot读取配置有一个优先级,放在jar包外面config目录优先级最高,主要是便于从外部修改配置,而不是改jar包中的文件。优先级如下:
步骤4:注意一个依赖的坑,
- 笔者多次通过java -jar的方式启动项目总是报如下错误:
ClassNotFoundException: org.springframework.boot.SpringApplication
- 后来发现时一个依赖的问题,问题详情可以见这个博客:
-SpringBoot使用yaml作为配置文件之坑
<dependency>
<groupId></groupId>
<artifactId>snakeyaml</artifactId>
<version>1.21</version>
</dependency>
步骤5,愉快的启动项目
- 加入–debug可以让你可以看到比较详细的启动日志
java -jar xxx-1.0.0.jar --debug
全自动化步骤
- 前面介绍的步骤中,需要手动的拷贝文件,并且jar包内外都存在配置,总感觉怪怪的(偷笑…)。这里引入一种自动化配置,将所有东西打成zip文件,直接发布到服务目录,解压后,即可启动。
自动化步骤1
- 还是同上面步骤1,2所示,指定打包插件和拷贝依赖的插件。
自动化步骤2
- 排除resources下面的yml(因为我们需要把它放在jar外部,不能让jar打包插件将其打入jar包classpath下去)
<resources>
<resource>
<directory>src/main/resources</directory>
<excludes>
<exclude>**/</exclude>
</excludes>
</resource>
</resources>
自动化步骤3,使用maven-assembly-plugin自定义打包
- 具体打包详情在配置中指定
<plugin>
<artifactId>maven-assembly-plugin</artifactId>
<configuration>
<appendAssemblyId>false</appendAssemblyId>
<descriptors>
<descriptor>src/main/resources/</descriptor>
</descriptors>
</configuration>
<executions>
<execution>
<id>make-assembly</id>
<phase>package</phase>
<goals>
<goal>single</goal>
</goals>
</execution>
</executions>
</plugin>
- 具体配置如下:
- 将放在外部config目录下
- 所有依赖打成zip压缩包
<assembly xmlns="/plugins/maven-assembly-plugin/assembly/1.1.3"
xmlns:xsi="http:///2001/XMLSchema-instance"
xsi:schemaLocation="/plugins/maven-assembly-plugin/assembly/1.1.3 /xsd/assembly-1.1.">
<id>package</id>
<formats>
<format>zip</format>
</formats>
<includeBaseDirectory>true</includeBaseDirectory>
<fileSets>
<fileSet>
<directory>${basedir}/src/main/resources</directory>
<includes>
<include>*.yml</include>
</includes>
<filtered>true</filtered>
<outputDirectory>${}config</outputDirectory>
</fileSet>
<fileSet>
<directory>src/main/resources/runScript</directory>
<outputDirectory>${}bin</outputDirectory>
</fileSet>
<fileSet>
<directory>${}/lib</directory>
<outputDirectory>${}lib</outputDirectory>
<includes>
<include>*.jar</include>
</includes>
</fileSet>
<fileSet>
<directory>${}</directory>
<outputDirectory>${}</outputDirectory>
<includes>
<include>*.jar</include>
</includes>
</fileSet>
</fileSets>
</assembly>
自动化步骤4,解压zip,启动
- 美滋滋的自动化