springboot-填坑系列-jar启动分离依赖lib和配置

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/xx.jar
    <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-jar-plugin</artifactId>
                <version>${maven.jar.plugin.version}</version>
                <configuration>
                    <archive>
                        <manifest>
                            <addClasspath>true</addClasspath>
                            <classpathPrefix>lib/</classpathPrefix>
                            <mainClass>com.xxx.Start</mainClass>
                        </manifest>
                    </archive>
                </configuration>
            </plugin>
步骤2,拷贝依赖到jar外面的lib目录
 <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-dependency-plugin</artifactId>
                <version>${maven.dependency.plugin.version}</version>
                <executions>
                    <execution>
                        <id>copy-lib</id>
                        <phase>prepare-package</phase>
                        <goals>
                            <goal>copy-dependencies</goal>
                        </goals>
                        <configuration>
                            <outputDirectory>${project.build.directory}/lib</outputDirectory>
                            <overWriteReleases>false</overWriteReleases>
                            <overWriteSnapshots>false</overWriteSnapshots>
                            <overWriteIfNewer>true</overWriteIfNewer>
                            <includeScope>compile</includeScope>
                        </configuration>
                    </execution>
                </executions>
            </plugin>
步骤3: 在和jar包同级的目录下新建一个config目录,放入application.yml文件
  • 这里可能有小伙伴有疑问了,打包的jar里面不是应该有application.yml文件吗,这里为什么再放一份?

    • 这是因为boot读取配置有一个优先级,放在jar包外面config目录优先级最高,主要是便于从外部修改配置,而不是改jar包中的application.yml文件。优先级如下:
      • 当前目录的config目录下
      • 当前目录
      • classpath的config目录下
      • classpath的根目录
步骤4:注意一个依赖的坑,
  • 笔者多次通过java -jar的方式启动项目总是报如下错误:
ClassNotFoundException: org.springframework.boot.SpringApplication
 <dependency>
            <groupId>org.yaml</groupId>
            <artifactId>snakeyaml</artifactId>
            <version>1.21</version>
        </dependency>
步骤5,愉快的启动项目
  • 加入–debug可以让你可以看到比较详细的启动日志
java -jar xxx-1.0.0.jar --debug 
全自动化步骤
  • 前面介绍的步骤中,需要手动的拷贝application.yml文件,并且jar包内外都存在配置,总感觉怪怪的(偷笑…)。这里引入一种自动化配置,将所有东西打成zip文件,直接发布到服务目录,解压后,即可启动。
自动化步骤1
  • 还是同上面步骤1,2所示,指定打包插件和拷贝依赖的插件。
自动化步骤2
  • 排除resources下面的yml(因为我们需要把它放在jar外部,不能让jar打包插件将其打入jar包classpath下去)
    <resources>
            <resource>
                <directory>src/main/resources</directory>
                <excludes>
                    <exclude>**/application.yml</exclude>
                </excludes>
            </resource>
        </resources>
自动化步骤3,使用maven-assembly-plugin自定义打包
  • 具体打包详情在assembly.xml配置中指定
<plugin>
                <artifactId>maven-assembly-plugin</artifactId>
                <configuration>
                    <appendAssemblyId>false</appendAssemblyId>
                    <descriptors>
                        <descriptor>src/main/resources/assembly.xml</descriptor>
                    </descriptors>
                </configuration>
                <executions>
                    <execution>
                        <id>make-assembly</id>
                        <phase>package</phase>
                        <goals>
                            <goal>single</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>
  • assembly.xml具体配置如下:
  • 将application.yml放在外部config目录下
  • 所有依赖打成zip压缩包
<assembly xmlns="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.3"
          xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
          xsi:schemaLocation="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.3 http://maven.apache.org/xsd/assembly-1.1.3.xsd">
<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>${file.separator}config</outputDirectory>
    </fileSet>

    <fileSet>
        <directory>src/main/resources/runScript</directory>
        <outputDirectory>${file.separator}bin</outputDirectory>
    </fileSet>
    <fileSet>
        <directory>${project.build.directory}/lib</directory>
        <outputDirectory>${file.separator}lib</outputDirectory>
        <includes>
            <include>*.jar</include>
        </includes>
    </fileSet>
    <fileSet>
        <directory>${project.build.directory}</directory>
        <outputDirectory>${file.separator}</outputDirectory>
        <includes>
            <include>*.jar</include>
        </includes>
    </fileSet>
</fileSets>
</assembly>
自动化步骤4,解压zip,启动
  • 美滋滋的自动化
发布了106 篇原创文章 · 获赞 21 · 访问量 19万+

猜你喜欢

转载自blog.csdn.net/u012811805/article/details/80878848
今日推荐